C++ 唤醒处于睡眠状态的QThread?
当QThread处于睡眠状态时,如何唤醒它 我有一个线程在后台运行,偶尔会醒来并做一些小事情,但是如果我想以可控的方式停止该线程,我必须等待他自己醒来,以便让他退出。由于他睡了很长时间,这可能会很烦人 下面是一个显示基本问题的小示例代码 让我们从本例中休眠5秒的线程开始,然后只打印一个点C++ 唤醒处于睡眠状态的QThread?,c++,qt,qthread,C++,Qt,Qthread,当QThread处于睡眠状态时,如何唤醒它 我有一个线程在后台运行,偶尔会醒来并做一些小事情,但是如果我想以可控的方式停止该线程,我必须等待他自己醒来,以便让他退出。由于他睡了很长时间,这可能会很烦人 下面是一个显示基本问题的小示例代码 让我们从本例中休眠5秒的线程开始,然后只打印一个点 #include <QDebug> #include "TestThread.h" void TestThread::run() { running = true; while(r
#include <QDebug>
#include "TestThread.h"
void TestThread::run()
{
running = true;
while(running == true)
{
qDebug() << ".";
QThread::sleep(5);
}
qDebug() << "Exit";
}
void TestThread::stop()
{
running = false;
}
#包括
#包括“TestThread.h”
void TestThread::run()
{
运行=真;
while(running==true)
{
qDebug()等待();
删除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();
}
#包括
#包括“TestThread.h”
QMutex睡眠互斥;
void TestThread::run()
{
qDebug()您可以使用睡眠,而不是简单的睡眠
这里的用法示例:我认为不存在可移植的解决方案(尽管在某些操作系统中可能有一些工具,如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";
}
void TestThread::run()
{
运行=真;
while(running==true)
{
qDebug()看看我链接的例子。想法是锁定互斥锁,并使用等待条件的wait(QMutex*,long)
函数替换睡眠,在stop()
函数中使用wakeAll()
或wakeOne()
。编辑不好:不应该从一个线程调用lock()
,然后unlock())
来自同一互斥对象上的另一个对象。所以你从来没有解锁过他?你一直在运行“bool”,所以停止循环?
#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();
}
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";
}