QWaitCondition让某个线程可以向其他线程通知,某种条件已经满足。单个或多个线程能阻塞等待QWaitCondition
通过wakeOne()或wakeAll()设定条件。用wakeOne()唤醒某个随机选中的线程,用wakeAll()唤醒全部线程。
例如:假设当用户按下一个键时,有三个任务需要执行。每个任务都可分离到单独的线程中执行,
那么线程run()主体结构大体是这样:
forever {
mutex.lock();
keyPressed.wait(&mutex);
do_something();
mutex.unlock();
}
这里,keyPressed变量是一个QWaitCondition类型的全局变量。
第四个线程会读取按压键的值,每当它读到一个值,它就唤醒其他三个线程一次,像下面这样:
forever {
getchar();
keyPressed.wakeAll();
}
三个线程唤醒的顺序没有定义。当键按下时,运行在do_something()中的线程将不会被唤醒。
因为他们不是在等待条件变量。
那么就造成了,按下键,任务却没有执行。
这种情况能通过一个计数器和一个QMutex守护它。
例如:以下是新的工作线程的代码
forever {
mutex.lock();
keyPressed.wait(&mutex);
++count;
mutex.unlock();
do_something();
mutex.lock();
--count;
mutex.unlock();
}
以下是第四个线程函数:
forever {
getchar();
mutex.lock();
// 休眠直到没有工作线程
while (count > 0) {
mutex.unlock();
sleep(1);
mutex.lock();
}
keyPressed.wakeAll();
mutex.unlock();
}
两个线程尝试同时修改同一个变量值是不可预测的, 所以互斥体必不可少。