Qt的可中断睡眠?

时间:2012-04-05 11:58:43

标签: c++ qt sleep interrupt

我在工作线程中想要睡一段特定的时间(通常是几百毫秒),但睡眠应该是可以中断的。以下是我的想法

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 - 等待更好的解决方案吗?

3 个答案:

答案 0 :(得分:2)

'正在使用带有超时的QWaitCondition - 等待更好的解决方案吗?'

是!

sleep()循环除了每100毫秒不必要地运行外,平均“中断”延迟为50毫秒。

答案 1 :(得分:0)

绝对等待一个条件变量,并让随附的条件告诉你为什么你被打断了 如果你不必使用QT-threads,c ++ 11和boost允许你为wait_for / timed_wait添加一个谓词,所以虚假的唤醒不会弄乱你的超时。

当然,如果你可以更进一步并且不打扰超时(如果条件变量可以处理所有情况),那就更方便了。

答案 2 :(得分:0)

如果您从另一个线程锁定并解锁,则可以使用QMutex::tryLock(int timeout)直接在互斥锁上等待。