| 主页 | 所有的类 | 主要的类 | 注释的类 | 分组的类 | 函数 |
QWaitCondition类是线程之间允许等待/唤醒的条件。 详情请见……
#include <qwaitcondition.h>
QWaitConditions允许一个线程告诉其它线程某种条件已经满足,一个或多个线程可以等待一个由wakeOne()或wakeAll()设定的条件QWaitCondition。使用wakeOne()会唤醒一种随机选择的事件或者wakeAll()会把它们全部唤醒。比如,假定每次用户按下一个键,我们有三个任务要同时执行,每个任务都可以放到一个线程中,每个线程的run()都应该是这样:
QWaitCondition key_pressed;
for (;;) {
key_pressed.wait(); // 这是一个QWaitCondition全局变量
// 键被按下,做一些有趣的事
do_something();
}
第四个线程回去读键按下并且每当它接收到一个的时候唤醒其它三个线程,就像这样:
QWaitCondition key_pressed;
for (;;) {
getchar();
// 在key_pressed中导致引起任何一个线程。wait()将会从这个方法中返回并继续执行
key_pressed.wakeAll();
}
注意这三个线程被唤醒的顺序是未定义的,并且当键被按下时,这些线程中的一个或多个还在do_something(),它们将不会被唤醒(因为它们现在没有等待条件变量)并且这个任务也就不会针对这次按键执行操作。这种情况是可以避免得,比如,就像下面这样做:
QMutex mymutex;
QWaitCondition key_pressed;
int mycount=0;
// 工人线程代码
for (;;) {
key_pressed.wait(); // 这是一个QWaitCondition全局变量
mymutex.lock();
mycount++;
mymutex.unlock();
do_something();
mymutex.lock();
mycount--;
mymutex.unlock();
}
// 读取按键线程代码
for (;;) {
getchar();
mymutex.lock();
// 睡眠,直到没有忙碌的工作线程才醒来。
while( count > 0 ) {
mymutex.unlock();
sleep( 1 );
mymutex.lock();
}
mymutex.unlock();
key_pressed.wakeAll();
}
互斥量是必须的,因为两个线程试图同时对同一个变量进行修改的结果是不可预知的。
释放锁定的mutex并且在线程事件对象上等待。mutex必须由调用线程初始锁定的。如果mutex没有在锁定状态,这个函数立即返回。如果mutex是一个递归互斥量,这个函数立即返回。mutex将被解锁,并且调用线程将会阻塞,直到下列条件之一满足时才醒来:
互斥量将以同样的锁定状态返回。这个函数提供的是允许从锁定状态到等待状态的原子转换。
也可以参考wakeOne()。
也可以参考wakeAll()。
这个文件是Qt工具包一部分。 版权所有 © 1995-2002 Trolltech。保留所有权利。
| Copyright © 2002 Trolltech | Trademarks | 译者:Cavendish | Qt 3.0.5版
|