主页 | 所有的类 | 主要的类 | 注释的类 | 分组的类 | 函数

QWaitCondition类参考

QWaitCondition类是线程之间允许等待/唤醒的条件。 详情请见……

#include <qwaitcondition.h>

所有成员函数的列表。

公有成员


详细描述

QWaitCondition类是线程之间允许等待/唤醒的条件。

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();
  }
  

互斥量是必须的,因为两个线程试图同时对同一个变量进行修改的结果是不可预知的。

也可以参考环境类线程类


成员函数文档

QWaitCondition::QWaitCondition ()

构造一个新的事件信号传输,比如,等待条件,对象。

QWaitCondition::~QWaitCondition () [虚]

删除这个事件信号传输,比如,等待条件,对象。

bool QWaitCondition::wait ( unsigned long time = ULONG_MAX )

在线程事件对象上等待。调用这个的线程将会阻塞,直到下列条件之一满足时才醒来:

也可以参考wakeOne()和wakeAll()。

bool QWaitCondition::wait ( QMutex * mutex, unsigned long time = ULONG_MAX )

这是一个重载成员函数,提供了方便。它的行为基本上和上面的函数相同。

释放锁定的mutex并且在线程事件对象上等待。mutex必须由调用线程初始锁定的。如果mutex没有在锁定状态,这个函数立即返回。如果mutex是一个递归互斥量,这个函数立即返回。mutex将被解锁,并且调用线程将会阻塞,直到下列条件之一满足时才醒来:

互斥量将以同样的锁定状态返回。这个函数提供的是允许从锁定状态到等待状态的原子转换。

也可以参考wakeOne()和wakeAll()。

void QWaitCondition::wakeAll ()

这将会唤醒所有等待QWaitCondition的线程。这些线程被唤醒的顺序依赖于操组系统的调度策略,并且不能被控制或预知。

也可以参考wakeOne()。

void QWaitCondition::wakeOne ()

这将会唤醒所有等待QWaitCondition的线程中的一个线程。这个被唤醒的线程依赖于操组系统的调度策略,并且不能被控制或预知。

也可以参考wakeAll()。


这个文件是Qt工具包一部分。 版权所有 © 1995-2002 Trolltech。保留所有权利。


Copyright © 2002 Trolltech Trademarks 译者:Cavendish
Qt 3.0.5版