Как я могу разбудить 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();
}