2

我在一个工作线程中,想休眠一段指定的时间(通常是几百毫秒),但是休眠应该是可中断的。这是我想出的

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带有超时等待的 a 是更好的解决方案吗?

4

3 回答 3

2

“使用带有超时等待的 QWaitCondition 是更好的解决方案吗?”

是的!

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

于 2012-04-05T12:06:52.287 回答
0

一定要等待一个条件变量,让伴随的条件告诉你为什么你被打断了。
如果您不必使用 QT 线程,c++11 和 boost 允许您向 wait_for/timed_wait 添加谓词,因此虚假唤醒不会影响您的超时。

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

于 2012-04-05T12:22:13.903 回答
0

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

于 2012-04-06T12:17:03.580 回答