QWaitCondition是Qt中的一个同步对象,主要用于在多线程环境中实现线程之间的通信和同步。
QWaitCondition的主要方法有wait()、wakeOne()、wakeAll()等。
wait()方法会让当前线程进入等待状态,直到其他线程调用wakeOne()或wakeAll()方法唤醒它。
wakeOne()方法会唤醒一个正在等待的线程。 wakeAll()方法会唤醒所有正在等待的线程。
QWaitCondition示例代码如下:
#include <QCoreApplication>
#include <QWaitCondition>
#include <QMutex>
class Thread : public QThread
{
public:
Thread(QWaitCondition &condition, QMutex &mutex)
: m_condition(condition), m_mutex(mutex) {}
protected:
void run()
{
m_mutex.lock();
qDebug() << "thread started";
m_condition.wait(&m_mutex);
qDebug() << "thread finished";
m_mutex.unlock();
}
private:
QWaitCondition &m_condition;
QMutex &m_mutex;
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QWaitCondition condition;
QMutex mutex;
Thread thread(condition, mutex);
thread.start();
qDebug() << "main thread waiting";
QThread::sleep(2);
qDebug() << "main thread waking up thread";
condition.wakeOne();
thread.wait();
return a.exec();
}
Thread类继承自QThread,并在构造函数中接收一个QWaitCondition引用和一个QMutex引用。这些将在主线程中定义并传入到Thread实例中。
在run()函数中,首先锁定互斥锁以防止其他线程访问共享资源。然后输出一条消息表示线程已经开始运行,并调用wait()函数等待条件变量变为真。当条件满足时,线程会自动从wait()函数返回并继续执行后面的代码。
在主线程中,先定义了一个QWaitCondition实例和一个QMutex实例,然后创建了一个Thread实例并将这两个对象传递给它。接下来启动子线程并让它运行起来。
在主线程中,先输出一条消息表示主线程正在等待子线程完成任务,然后让主线程休眠一段时间,再输出一条消息表示主线程已经醒来并准备唤醒子线程。
调用wakeOne()函数来改变条件变量的状态,使得等待中的子线程能够继续运行。最后,调用wait()函数来等待子线程完成任务并退出。
注意:wait()方法需要传入一个指向互斥锁的指针,这是因为线程在等待期间必须保持对互斥锁的所有权,以防止其他线程在同一时间修改共享数据。