QWaitCondition和qmutex一同使用的例子,需要在循环中调用与释放
时间: 2024-10-21 09:18:10 浏览: 12
Qt中使用QQueue模拟消息队列
5星 · 资源好评率100%
QWaitCondition和QMutex在Qt中经常一起用于线程同步,特别是当一个线程等待某个条件满足后再继续执行时。下面是一个简单的例子,假设我们有一个主线程和一个工作线程,主线程持有QMutex来保护共享数据,并使用QWaitCondition来唤醒工作线程:
```cpp
#include <QObject>
#include <QThread>
#include <QMutex>
#include <QWaitCondition>
class Worker : public QObject {
public:
explicit Worker(QObject *parent = nullptr) : QObject(parent) {}
private slots:
void doWork() {
// 假设有一个共享的数据变量data
QMutexLocker locker(&mutex);
while (!stopSignal.isSet()) { // 线程持续运行直到接收到停止信号
if (dataIsReady()) { // 检查数据是否准备好
qDebug() << "Data is ready, starting work";
// 进行处理...
// 当工作完成,通知主线程更新数据状态
dataProcessed();
break;
}
qWaitFor(&condition, mutex); // 如果数据未准备,进入等待状态
}
emit workFinished(); // 工作完成后发出信号
}
signals:
void dataProcessed(); // 数据处理完成信号
void stopSignalSet(); // 主线程发送停止工作的信号
private:
QMutex mutex;
QWaitCondition condition;
bool stopSignal = false; // 表示主线程是否需要停止工作
};
int main(int argc, char **argv) {
QApplication app(argc, argv);
Worker worker;
QThread thread;
worker.moveToThread(&thread);
thread.start();
// 主线程
QTimer::singleShot(0, &worker, SLOT(stopSignalSet())); // 假设延迟0秒后设置停止信号
QObject::connect(&worker, &Worker::workFinished, &app, &QApplication::quit); // 当工作完成退出应用
return app.exec();
}
```
在这个例子中,`doWork()`函数会一直等待直到`dataIsReady()`返回`true`或接收到`stopSignalSet()`。当数据准备好时,它会立即开始工作并通知主线程。如果数据未准备好,工作线程会在`qWaitFor()`中阻塞,直到`condition`被唤醒。
阅读全文