关于QWaitCondition等待超时的困惑
现有如下代码,在子线程中有一耗时操作,主线程通过QWaitCondition设置2秒等待,希望执行结果是要么子线程2秒内执行完成,要么2秒后结束子线程。通过在子线程中使用 sleep(5)模拟耗时操作,模拟超时情况。执行的结果是QWaitCondition.wait 5秒后才返回false,而不是2秒后。请问是否有人遇到类似的情况,或是QWaitCondition使用不当,请指出,谢谢!
#include <QApplication>
#include <QDebug>
#include <QWaitCondition>
#include <QMutex>
#include <QThread>
#include <QEventLoop>
#include <QDateTime>
QWaitCondition condition;
QMutex mutex;
class TestThread : public QThread
{
protected:
virtual void run()
{
mutex.lock();
sleep(5);
qDebug() << "test: " << QThread::currentThreadId();
condition.wakeAll();
mutex.unlock();
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
TestThread test;
test.start();
mutex.lock();
QTime time;
time.start();
if(condition.wait(&mutex, 2000))
{
qDebug() << "finished";
}
else
{
qDebug() << "timeout";
}
qDebug() << time.elapsed();
qDebug() << "main: " << QThread::currentThreadId();
mutex.unlock();
return a.exec();
}
#include <QApplication>
#include <QDebug>
#include <QWaitCondition>
#include <QMutex>
#include <QThread>
#include <QDateTime>
QWaitCondition condition;
QMutex mutex;
class TestThread : public QThread
{
protected:
void run() override
{
// 删除子线程对mutex的加锁
sleep(5);
condition.wakeAll();
// 删除解锁
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
TestThread test;
test.start();
// 主线程在wait前后加锁
mutex.lock();
QTime time;
time.start();
if(condition.wait(&mutex, 2000))
{
qDebug() << "finished";
}
else
{
qDebug() << "timeout";
}
qDebug() << time.elapsed();
mutex.unlock();
return a.exec();
}
不知道你这个问题是否已经解决, 如果还没有解决的话: