Разбудить QThread, который находится в спящем режиме?

Как я могу разбудить QThread, когда он спит?

У меня есть поток, который работает в фоновом режиме, и d время от времени просыпается и делает какие-то мелочи, однако, если я хочу остановить этот поток контролируемым образом, я должен подождать, пока он сам проснется, чтобы заставить его выйти. А так как он спит довольно долго, это может сильно раздражать.

Вот небольшой пример кода, который показывает основную проблему.

Давайте начнем с потока, который в этом примере спит 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();
}
7
задан Johan 15 July 2011 в 11:56
поделиться