Ich bin in einem Worker-Thread und möchte für eine bestimmte Zeit (in der Regel ein paar hundert Millisekunden) schlafen, aber der Schlaf sollte unterbrechbar sein. Hier ist, was ich habe kommen mitUnterbrechbarer Schlaf in Qt?
void DummyScope::sleepForSamples() {
if(m_sampleSleep < 100) {
MySleeper::sleep(m_sampleSleep);
return;
}
// sleep in periods of 100 ms, to be responsible for shutdown requests
qint64 t = QDateTime::currentMSecsSinceEpoch();
qint64 end = t + m_sampleSleep;
while(t + 100 <= end) {
MySleeper::sleep(100);
t = QDateTime::currentMSecsSinceEpoch();
// TODO: check here whether we are interrupted
}
if(end > t) {
MySleeper::sleep(end - t);
}
}
jedoch, die ein bisschen verworren aussieht und ich frage mich, ob es einen besseren Weg, dies zu tun. Verwenden Sie eine QWaitCondition
mit einer Zeitüberschreitung - warten Sie eine bessere Lösung?
Können Sie bitte eine Begründung/etwas Hintergrund geben? Dinge wie Wartezustände und Mutexe klingen wie schweres POSIX-Zeug. Im Gegensatz dazu gibt es in meiner Schleife nur grundlegende Schläfchen. –
Sie benötigen keinen Mutex, nur 'wenn QWaitCondition :: wait (timeout)'. –
@ JohannesSchaub-litb Ich denke, es ist, weil mit einem Timer Ihr Prozess nie aufwacht, stattdessen ist es der OS-Scheduler, der erkennt, wenn Ihr Prozess unterbrochen werden muss. Dies hat auch eine bessere Latenz. Bei Ihrer Schleife wird eine durchschnittliche Latenzzeit von 2 auftreten, bevor Sie aufwachen, um ein Ereignis zu verarbeiten. – sashoalm