2011-07-15 18 views
7

QThreadがスリープ状態になっているとき、私はどのように目を覚ますことができますか?スリープ状態にあるQThreadをスリープ状態にしますか?

私はバックグラウンドで実行されているスレッドを持っていて、次に目を覚ましていくつかの小さなものを行いますが、制御された方法でスレッドを停止したい場合は、彼が彼によって目を覚ますのを待たなければなりません彼を止めるために自己。そして、彼はかなり眠っているので、これはかなり迷惑になることがあります。

基本的な問題を示す少しのコード例を示します。

この例では5秒間スリープしてからドットを印刷するスレッドから始めましょう。

#include <QDebug> 
#include "TestThread.h" 

void TestThread::run() 
{ 
    running = true; 
    while(running == true) 
    { 
     qDebug() << "."; 
     QThread::sleep(5); 
    } 
    qDebug() << "Exit"; 
} 

void TestThread::stop() 
{ 
    running = false; 
} 

次にスレッドを開始し、その後、彼を殺すメインがあります。

#include <QDebug> 
#include "TestThread.h" 

int main(int argc, char *argv[]) 
{ 
    qDebug() << "Start test:"; 
    TestThread *tt = new TestThread(); 

    tt->start(); 
    sleep(2); 
    tt->stop(); 
    tt->wait(); 

    delete tt;  
} 

問題は、tt-> wait();という問題です。スレッドがスリープしている5秒間待たなければなりません。 「スリープからの起床」のようなものを呼び出すだけで、続けることはできますか?

これを行うには良い方法がありますか?

/おかげ


更新私はQMutexとのtryLockでそれ働いてしまった:

#include <QDebug> 
#include "TestThread.h" 

QMutex sleepMutex; 

void TestThread::run() 
{ 
    qDebug() << "Begin"; 
    //1. Start to lock 
    sleepMutex.lock(); 
    //2. Then since it is locked, we can't lock it again 
    // so we timeout now and then. 
    while(!sleepMutex.tryLock(5000)) 
    { 
     qDebug() << "."; 
    } 
    //4. And then we cleanup and unlock the lock from tryLock. 
    sleepMutex.unlock(); 
    qDebug() << "Exit"; 
} 

void TestThread::stop() 
{ 
    //3. Then we unlock and allow the tryLock 
    // to lock it and doing so return true to the while 
    // so it stops. 
    sleepMutex.unlock(); 
} 

しかし、QWaitConditionを使用する方がよいでしょうか?それとも同じですか?


更新:QMutexブレークそれが起動し、彼を止める同じトレッドでない場合は、 はので、ここでQWaitConditionと試みています。

#include <QDebug> 
#include <QWaitCondition> 
#include "TestThread.h" 

QMutex sleepMutex; 

void TestThread::run() 
{ 
    qDebug() << "Begin"; 

    running = true; 
    sleepMutex.lock(); 
    while(!waitcondition.wait(&sleepMutex, 5000) && running == true) 
    { 
     qDebug() << "."; 
    } 
    qDebug() << "Exit"; 
} 

void TestThread::stop() 
{ 
    running = false; 
    waitcondition.wakeAll(); 
} 

答えて

6

あなたは、単純なsleepではなくQWaitConditionを使用することができます。 Ifはあなたにもっと多くの制御を与えます。ここ

使用例:Wait Conditions Example

+0

いいですが、どういう意味ですか? – Johan

+0

リンク先の例を見てください。アイデアは、mutexをロックし、スリープ状態を置き換えるwait条件の 'wait(QMutex *、long)'関数を使用し、 'stop()'関数で 'wakeAll()'または 'wakeOne()'を使用することです。あなたの編集はうまくいかず、あるスレッドから 'lock()'を呼び出して、同じmutexオブジェクトの別のスレッドから 'unlock()'を呼び出すべきではありません。 – Mat

+0

だからあなたは彼をロック解除しない?あなたは "bool running"を維持してループを止めますか? – Johan

1

(POSIX信号のようないくつかのオペレーションシステムでは、いくつかの施設、があるかもしれませんが)私は、ポータブルソリューションが存在することはないと思います。とにかく、Qtの自体は、このようにあなたが

void TestThread::run() 
{ 
    running = true; 
    while(running == true) 
    { 
     qDebug() << "."; 
     // Quantize the sleep: 
     for (int i = 0; i < 5 && running; ++i) QThread::sleep(1); 
    } 
    qDebug() << "Exit"; 
} 

のようにそれをシミュレートすることができしかし、マットで指摘したように最善の解決策はまだ、QWaitConditionになり、このような手段を提供していません。

関連する問題