PySide6.QtCore.QWaitCondition¶
- class QWaitCondition¶
QWaitCondition
类提供了一个条件变量用于线程同步。更多…概要¶
方法¶
def
__init__()
def
notify_all()
def
notify_one()
def
wait()
def
wakeAll()
def
wakeOne()
注意
本文档可能包含从C++自动翻译到Python的代码片段。我们始终欢迎对代码片段翻译的贡献。如果您发现翻译问题,您也可以通过在我们的https:/bugreports.qt.io/projects/PYSIDE上创建工单来告知我们。
详细描述¶
警告
本节包含从C++自动翻译到Python的代码片段,可能包含错误。
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 += 1 mutex.unlock() do_something() mutex.lock() count -= 1 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()
互斥锁是必要的,因为两个线程试图同时改变同一变量的值的结果是不可预测的。
等待条件是一种强大的线程同步原语。使用等待条件的生产者和消费者示例展示了如何使用
QWaitCondition
作为QSemaphore
的替代方案,来控制生产者线程和消费者线程共享的循环缓冲区的访问。另请参阅
QMutex
QSemaphore
QThread
使用等待条件的生产者和消费者- __init__()¶
构造一个新的等待条件对象。
- notify_all()¶
此函数是为了STL兼容性而提供的。它等同于
wakeAll()
。- notify_one()¶
此函数是为了STL兼容性而提供的。它等同于
wakeOne()
。- wait(lockedMutex[, deadline=QDeadlineTimer(QDeadlineTimer.Forever)])¶
- Parameters:
lockedMutex –
QMutex
deadline –
QDeadlineTimer
- Return type:
布尔
释放
lockedMutex
并等待条件。调用线程必须最初锁定lockedMutex
。如果lockedMutex
未处于锁定状态,则行为未定义。如果lockedMutex
是递归互斥锁,则此函数立即返回。lockedMutex
将被解锁,调用线程将阻塞,直到满足以下任一条件:lockedMutex
将返回到相同的锁定状态。此函数用于允许从锁定状态到等待状态的原子转换。- wait(lockedMutex, time)
- Parameters:
lockedMutex –
QMutex
time – int
- Return type:
布尔
这是一个重载函数。
释放
lockedMutex
并在等待条件上等待time
毫秒。- wait(lockedReadWriteLock[, deadline=QDeadlineTimer(QDeadlineTimer.Forever)])
- Parameters:
lockedReadWriteLock –
QReadWriteLock
deadline –
QDeadlineTimer
- Return type:
布尔
释放
lockedReadWriteLock
并在等待条件上等待。lockedReadWriteLock
必须最初由调用线程锁定。如果lockedReadWriteLock
未处于锁定状态,此函数将立即返回。lockedReadWriteLock
不得递归锁定,否则此函数将无法正确释放锁。lockedReadWriteLock
将被解锁,调用线程将阻塞,直到满足以下任一条件:lockedReadWriteLock
将返回到相同的锁定状态。此函数用于允许从锁定状态到等待状态的原子转换。- wait(lockedReadWriteLock, time)
- Parameters:
lockedReadWriteLock –
QReadWriteLock
time – int
- Return type:
布尔
这是一个重载函数。
释放
lockedReadWriteLock
并在等待条件上等待time
毫秒。- wakeAll()¶
唤醒所有在等待条件上等待的线程。线程被唤醒的顺序取决于操作系统的调度策略,无法控制或预测。
另请参阅
- wakeOne()¶
唤醒一个在等待条件上等待的线程。被唤醒的线程取决于操作系统的调度策略,无法控制或预测。
如果你想唤醒一个特定的线程,通常的解决方案是使用不同的等待条件,并让不同的线程在不同的条件下等待。
另请参阅