2012-04-05 38 views
2

我在一個工作線程中,想睡一段指定的時間(通常是幾百毫秒),但睡眠應該是可以中斷的。以下是我想出了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); 
    } 
} 

然而,看起來有點令人費解,我不知道是否有更好的方法來做到這一點。正在使用帶有超時的QWaitCondition-等待更好的解決方案?

回答

2

'正在使用帶有超時的QWaitCondition - 等待更好的解決方案嗎?'

是的!

sleep()循環除了每100ms不必要地運行外,其平均'中斷'延遲爲50ms。

+0

你能給一個理由/一些背景嗎?像等待條件和互斥體聽起來像重POSIX的東西。相反,在我的循環中只有基本的睡眠。 – 2012-04-05 12:08:47

+0

只需'如果QWaitCondition :: wait(timeout)'就不需要任何互斥體。 – 2012-04-05 12:16:25

+0

@ JohannesSchaub-litb我認爲這是因爲有了計時器,你的進程永遠不會醒來,相反它是OS調度程序,可以檢測你的進程何時需要中斷。此外,這有一個更好的延遲,隨着你的循環,在你處理一個事件之前,你的超時/ 2的平均延遲將會被調整。 – sashoalm 2012-04-05 12:17:46

0

絕對等待一個條件變量,讓伴隨的條件告訴你爲什麼你被打斷。
如果你不需要使用QT線程,C++ 11和boost可以讓你添加一個謂詞給wait_for/timed_wait,所以虛假的喚醒不會混淆你的超時。

當然,如果你可以更進一步,不用擔心超時(如果條件變量可以處理所有情況),它更加容易解決。

+0

@ JohannesSchaub-litb:我只是發現了傳遞給boost/C++ 11的謂詞(如果這是你所要求的虛假喚醒事物)。 Qt(和其他我知道的實現)沒有它。 – stefaanv 2012-04-06 09:02:09

0

如果您從另一個線程鎖定並解鎖它,您可以直接在QMutex::tryLock(int timeout)的互斥體上等待。