2012-04-05 69 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)的互斥体上等待。