任务线程需要等待一定的条件再继续执行。
Qt中的条件等待是通过QWaitCondition类实现的。作用就是任务线程等待某个条件并睡眠,等条件满足时,线程被唤醒并执行后续操作。Qt中,QWaitCondition通常和QMutex互斥锁配对使用,互斥锁用于保护共享资源的访问,条件等待用于等待某个条件的发生,从而实现线程之间的同步和通信。
- 创建QWaitCondition和QMutex对象
- 在需要等待某个条件的线程中,先获取QMutex来保护共享资源
- 判断条件是否满足,如果不满足则调用QWaitCondition的wait(),等待条件满足
- 满足条件的线程中,先获取QMutex来保护共享资源
- 修改条件,然后调用QWaitCondition的wakeOne()或者wakeAll(),唤醒等待的线程
- 被唤醒的线程再次获取QMutex,判断条件是否满足
- 如果条件满足则继续执行,否则继续等待
在这个示例中,Producer类模拟生产者线程,它会在2秒后将isReady标志设置为true,并发出信号唤醒等待的线程。Consumer类模拟消费者线程,它会在等待条件满足时被阻塞,直到收到信号后才会继续执行。在主函数中,创建了一个生产者和一个消费者对象,并启动它们的线程。然后使用wait()函数等待线程执行完毕。当生产者线程将isReady标志设置为true并发出信号后,消费者线程会被唤醒,并输出"消费者收到信号,开始消费"的信息。
- #include
- #include
- #include
- #include
-
- QWaitContion condition;
- QMutex mutex;
- bool isReady = false;
-
- class ProducerThread : public QThread
- {
- public:
- void run() override
- {
- qDebug("ProducerThread>>>>>>>");
- QThread::sleep(2);
- QMutexLocker locker(&mutex);
- isReady = true;
- condition.wakeOne();
-
- }
- };
-
- class ConsumerThread : public QThread
- {
- public:
- void run() override
- {
- qDebug(">>>>>>>ConsumerThread");
- QMutexLocker locker(&mutex);
- while(!isReady){
- condition.wait(&mutex);
- }
- qDebug() << "消费者收到信号,开始消费";
- }
- };
- int main(int argc, char *argv[])
- {
- QCoreApplication a(argc, argv);
- ProducerThread producerThread;
- ConsumerThread consumerThread;
-
- consumerThread.start();
- producerThread.start();
- consumerThread.wait();
- producerThread.wait();
-
- return a.exec();
- }
-