2012-04-05 14 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

根拠/背景を教えていただけますか?待機条件やmutexのようなものは、重いPOSIXのように聞こえます。対照的に、私のループには基本的な睡眠しかありません。 –

+0

QWaitCondition :: wait(タイムアウト)の場合は、単に 'mutex'を使う必要はありません。 –

+0

@ JohannesSchaub-litb私はそれがタイマーではあなたのプロセスが起きることはなく、代わりにあなたのプロセスが中断される必要があることを検出するOSスケジューラーだからだと思います。また、これはより良いレイテンシを持っています。あなたのループでは、イベントを処理するために目を覚ます前に、あなたのタイムアウト/ 2の平均レイテンシがあります。 – sashoalm

0

間違いなく条件変数を待って、付随する条件で中断した理由を伝えてください。
QTスレッドを使用する必要がない場合、C++ 11とboostを使用すると、wait_for/timed_waitに述語を追加できます。したがって、偽のウェイクアップはタイムアウトを邪魔しません。

もちろん、1ステップ進んでタイムアウト(条件変数がすべてのケースを処理できる場合)を気にする必要がなければ、さらに便利です。

+0

@ JohannesSchaub-litb:私はちょうどブースト/ C++ 11で渡す述語について知っていました(あなたが尋ねる偽の起床のことです)。 Qt(と私が知っている他の実装)は持っていません。 – stefaanv

0

QMutex::tryLock(int timeout)でmutexをロックして別のスレッドからロック解除すると、そのまま待つことができます。