QT 实现多线程的同步阻塞等待功能
时间: 2024-09-25 20:09:38 浏览: 23
在Qt中,要实现多线程的同步阻塞等待(通常用于处理I/O操作或等待某个条件),你可以使用`QWaitCondition`和`QMutex`。这两个工具组合起来提供了一种安全的方式来让主线程暂停直到子线程完成某种任务。
首先,你需要包含必要的头文件:
```cpp
#include <QObject>
#include <QThread>
#include <QWaitCondition>
#include <mutex>
```
然后创建一个基类,比如`WorkerThread`,继承自`QObject`并添加`QWaitCondition`和`QMutex`实例:
```cpp
class WorkerThread : public QObject
{
public:
explicit WorkerThread(QObject *parent = nullptr)
: QObject(parent), m_condition(new QWaitCondition()), m_mutex(new QMutex()) {}
protected slots:
void doWork()
{
// 执行耗时的操作
// ...
// 当工作完成后,通知主线程
m_mutex->lock();
m_condition->wakeOne(); // 唤醒一个等待者(主线程)
m_mutex->unlock();
}
private:
QWaitCondition *m_condition;
QMutex *m_mutex; // 互斥锁,防止多个线程同时访问wait条件
};
```
在主线程中,你可以创建一个`WorkerThread`的实例,并启动一个新的线程来执行工作。当`doWork()`被调用后,主线程可以通过`wait()`方法阻塞,直到子线程通知完成:
```cpp
// 主线程
void mainFunction()
{
WorkerThread worker;
// 创建新线程
QThread workerThread(&worker);
worker.moveToThread(&workerThread);
// 连接信号槽,当工作完成时通知主线程
connect(&worker, &WorkerThread::doWorkFinished, this, [](){
qDebug() << "Work finished";
});
// 启动新线程
workerThread.start();
// 子线程开始工作后,主线程等待
m_workerMutex.lock();
while (!m_workDone) { // m_workDone是标志,表示工作已完成
m_condition->wait(m_workerMutex); // 阻塞等待
}
m_workerMutex.unlock();
}
```
在`mainFunction`中,确保维护一个标志`bool m_workDone`,并在`doWorkFinished`信号连接处设置为`true`,然后在`wait()`之前检查这个标志。