C++ 唤醒处于睡眠状态的QThread?

C++ 唤醒处于睡眠状态的QThread?,c++,qt,qthread,C++,Qt,Qthread,当QThread处于睡眠状态时,如何唤醒它 我有一个线程在后台运行,偶尔会醒来并做一些小事情,但是如果我想以可控的方式停止该线程,我必须等待他自己醒来,以便让他退出。由于他睡了很长时间,这可能会很烦人 下面是一个显示基本问题的小示例代码 让我们从本例中休眠5秒的线程开始,然后只打印一个点 #include <QDebug> #include "TestThread.h" void TestThread::run() { running = true; while(r

当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;
}
#包括
#包括“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";
}