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);
   }
}

しかし、それは少し複雑に見えます。これを行うためのより良い方法があるかどうか疑問に思います。QWaitConditiontimeout-waitを使用すると、より良い解決策になりますか?

4

3 に答える 3

2

「タイムアウト待ちで QWaitCondition を使用することは、より良い解決策ですか?」

はい!

sleep() ループは、不必要に 100 ミリ秒ごとに実行されることを除けば、平均 50 ミリ秒の「割り込み」レイテンシがあります。

于 2012-04-05T12:06:52.287 に答える
0

QMutex::tryLock(int timeout)別のスレッドからロックおよびロック解除する場合は、ミューテックスで直接待機できます。

于 2012-04-06T12:17:03.580 に答える
0

必ず条件変数を待機し、付随する条件によって、中断された理由がわかるようにします。
QT スレッドを使用する必要がない場合、c++11 とブーストでは、wait_for/timed_wait に述語を追加できるため、偽のウェイクアップによってタイムアウトが発生することはありません。

もちろん、さらに一歩進んで、タイムアウトを気にしなくてもよい場合 (条件変数がすべてのケースを処理できる場合) は、さらに便利です。

于 2012-04-05T12:22:13.903 に答える