QT waitCondition.wait(&mutex, timeout) 能举个例子吗?
时间: 2024-09-10 14:08:23 浏览: 51
`QWaitCondition::wait()` 是Qt框架中的一个线程同步方法,它允许当前线程在满足特定条件之前进入睡眠状态。此方法通常与`QMutex`一起使用,确保多个线程之间的同步。此方法有两种重载形式,其中一种接受一个超时时间参数`timeout`(以毫秒为单位),它指定了线程将等待的最大时间。
下面是一个简单的例子,展示了如何使用`QWaitCondition`和`QMutex`来同步线程:
```cpp
#include <QCoreApplication>
#include <QThread>
#include <QMutex>
#include <QWaitCondition>
#include <QDebug>
class WorkerThread : public QThread
{
Q_OBJECT
public:
WorkerThread(QWaitCondition& condition, QMutex& mutex)
: condition(condition), mutex(mutex) {}
protected:
void run() override {
mutex.lock();
qDebug() << "Worker thread: waiting for signal";
// 等待条件被满足
if (!condition.wait(&mutex, 5000)) {
qDebug() << "Worker thread: timeout happened";
} else {
qDebug() << "Worker thread: condition met!";
}
mutex.unlock();
}
private:
QWaitCondition& condition;
QMutex& mutex;
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QMutex mutex;
QWaitCondition condition;
WorkerThread workerThread(condition, mutex);
workerThread.start();
// 主线程等待一段时间,模拟工作
QThread::sleep(2);
// 当主线程准备好了,它会发出信号
qDebug() << "Main thread: signaling condition";
condition.wakeOne(); // 只唤醒一个等待的线程
workerThread.wait();
return a.exec();
}
#include "main.moc"
```
在这个例子中,我们有一个工作线程`WorkerThread`,它在运行时会尝试获取互斥锁`mutex`,然后调用`QWaitCondition::wait()`方法。这个调用会使工作线程休眠,直到某个条件被满足。在这个例子中,主线程在两秒后会通过`QWaitCondition::wakeOne()`方法发出一个信号。这个信号会唤醒一个正在等待`condition.wait()`调用的线程。如果在5秒内条件没有被满足(例如,主线程没有及时发出信号),线程将因为超时而被唤醒。
请注意,为了确保同步,我们在调用`wait()`之前和之后都获取和释放了互斥锁。
阅读全文