QTime oder QTimer warten, für den timeout
Ich bin writting eine Qt-Anwendung, und ich habe eine vier-Stunden-loop (in einem separaten thread). In diesem vier-Stunden-Schleife, die ich habe:
- Sachen tun mit der seriellen Schnittstelle;
- warte eine Feste Zeitspanne;
- noch einige weitere Sachen mit der seriellen Schnittstelle;
- warten, eine beliebige Menge von Zeit.
- bei 500ms in der Vergangenheit, nicht mehr Zeug;
- Gehe zu 1. und wiederholen Sie den Vorgang für vier Stunden.
Derzeit ist meine Methode, dies zu tun ist wirklich schlecht, und stürzt auf einigen Computern. Ich habe eine ganze Menge code, aber der folgende Codeausschnitt grundsätzlich zeigt das problem. Die CPU geht auf ~100% und kann schließlich den computer zum Absturz bringen.
void CRelayduinoUserControl::wait(int timeMS)
{
int curTime = loopTimer->elapsed();
while(loopTimer->elapsed() < curTime + timeMS);
}
Muss ich irgendwie warten für eine bestimmte Zeit zu übergeben, bevor es weiter mit dem Programm. Gibt es eine Funktion, die nur warten, für einige beliebige Zeit, während halten alle Timer gehen?
InformationsquelleAutor Jean-Luc | 2012-04-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie schlafen wollen in QT verwenden QTimer. Schließen Sie einfach das timeout-signal vom timer auf den Steckplatz, der enthält den code, den Sie wollen, zu tun, jeden x-Höhe der Zeit.
Der QTimer ist dein timer. Warum müssen Sie halten einige andere timer laufen?
Denn, ich muss etwas tun, alle 500 MS für vier Stunden in einem separaten thread. Wenn ich Schlaf, den Timer zu stoppen...
InformationsquelleAutor David D
IMO sollten Sie die signal/slot-Mechanismus trotz der im inneren warten eine Weile. Code könnte etwa so lauten:
Nun, Sie können leicht verändern Sie es mit einem anderen Timer zu warten für 500 ms timeout, während Sie in der 4h warten. IMO ist der einfachste Ansatz, anstatt einen anderen thread.
Die Schönheit einer QThread ist, dass es nicht verlassen, bis Sie den Anruf
thread->exit()
. Ein Standard-QThread Umsetzung spins eine Ereignis-Schleife in seinerun()
Methode. Dieses Ereignis-Schleife wird so lange aktiv, bis Sie zu verlassen. Der code, die, wenn es darauf wartet, dass ein timeout, wird in der Tat empfängt die Signale und Ereignisse - es ist eine asynchrone, nachdem alle: es wird schnell ein bisschen code dann wieder in die event-Schleife, die, wenn es abgehttimerSlot()
.InformationsquelleAutor Flynch