QT 多线程实现超时阻塞等待另一个线程的消息
时间: 2024-09-25 13:16:07 浏览: 30
在Qt中,要实现超时阻塞等待另一个线程的消息,可以利用`QWaitCondition`配合`QMutex`来同步线程操作。`QWaitCondition`允许主线程在一个特定条件满足时唤醒等待在其上的子线程。以下是一个简单的示例:
```cpp
#include <QObject>
#include <QThread>
#include <QMutex>
#include <QWaitCondition>
class WorkerThread : public QThread
{
public:
explicit WorkerThread(QObject *parent = nullptr)
: QThread(parent), m_done(false), m_condition(nullptr) {}
private:
void run()
{
// 假设worker thread执行一些耗时任务...
doLongTask();
// 完成后设置标志并通知主线程
m_done = true;
if (m_condition) { // 如果有QWaitCondition实例
m_condition->wakeOne(); // 唤醒一个等待者(这里是主线程)
}
}
void doLongTask()
{
// 模拟长时间运行的任务
QThread::sleep(3000); // 睡眠3秒
}
signals:
void taskFinished();
public slots:
void waitForTaskCompletion(int timeoutMS = -1)
{
QMutexLocker locker(&m_mutex);
while (!m_done && (timeoutMS == -1 || QTime::currentTime().msSinceStartOfDay() < timeoutMS)) {
m_condition->wait(m_mutex, QDuration(timeoutMS, Q TimeUnit::Milliseconds)); // 超时等待
}
}
private:
bool m_done;
QWaitCondition* m_condition; // 存储线程间的同步条件
QMutex m_mutex; // 用于保护共享状态
};
// 主线程使用
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
WorkerThread worker;
worker.moveToThread(&worker);
// 创建并启动工作线程
worker.start();
// 在主线程中等待工作线程完成任务
worker.taskFinished().connect(worker.waitForTaskCompletion); // 连接信号与槽
// 主线程继续执行其他任务...
return app.exec();
}
```
在这个示例中,主线程通过连接`taskFinished()`信号和`waitForTaskCompletion()`槽,实现了主线程在指定时间内等待工作线程完成任务。如果工作线程超过设定的时间还未完成,`waitForTaskCompletion()`会超时退出。