Home · All Classes · Modules  · QSS HELP  · QSS 案例 · VER007 HOME

QWaitCondition Class Reference
[QtCore module]

该QWaitCondition类提供了线程同步的条件变量。More...

Methods


Detailed Description

该QWaitCondition类提供了线程同步的条件变量。

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();
     // Sleep until there are no busy worker threads
     while (count > 0) {
         mutex.unlock();
         sleep(1);
         mutex.lock();
     }
     keyPressed.wakeAll();
     mutex.unlock();
 }

互斥锁是必要的,因为两个线程试图改变同一个变量的值的结果同时是不可预知的。

等待条件是一个强大的线程同步原语。该Wait Conditions示例显示了如何使用QWaitCondition作为替代QSemaphore用于控制访问环形缓冲器由一个生产者线程和消费者线程共享。


Method Documentation

QWaitCondition.__init__ (self)

构造一个新的等待条件的对象。

bool QWaitCondition.wait (self, QMutex mutex, int msecs = ULONG_MAX)

释放锁定mutex并等待在等待条件。该mutex必须首先锁定调用线程。如果mutex是不是在锁定状态,该函数将立即返回。如果mutex是一个递归互斥体,该函数立即返回。该mutex将被解锁,并且调用线程将被阻塞,直到下列任一条件满足:

互斥将被返回到相同的锁定状态。这个功能被提供,以允许从锁定状态到等待状态的原子跃迁。

See also wakeOne()和wakeAll( ) 。

bool QWaitCondition.wait (self, QReadWriteLock readWriteLock, int msecs = ULONG_MAX)

释放锁定readWriteLock并等待在等待条件。该readWriteLock必须首先锁定调用线程。如果readWriteLock是不是在锁定状态,该函数将立即返回。该readWriteLock不能被递归锁定,否则此功能将无法正常释放该锁。该readWriteLock将被解锁,并且调用线程将被阻塞,直到下列任一条件满足:

readWriteLock将返回到相同的锁定状态。这个功能被提供,以允许从锁定状态到等待状态的原子跃迁。

此功能被引入Qt的4.4 。

See also wakeOne()和wakeAll( ) 。

QWaitCondition.wakeAll (self)

唤醒等待等待条件的所有线程。在该线程被唤醒的顺序依赖于操作系统的调度策略,并不能被控制或预测。

See also wakeOne( ) 。

QWaitCondition.wakeOne (self)

唤醒等待的一个线程等待条件。该被唤醒的线程依赖于操作系统的调度策略,并且不能被控制或预测。

如果你想唤醒一个特定的线程,该解决方案通常使用不同的等待状态,并有不同的线程在等待不同的条件。

See also wakeAll( ) 。




PyQt 4.10.3 for X11 Copyright © Riverbank Computing Ltd and Nokia 2012 Qt 4.8.5