PySide6.QtCore.QWaitCondition

class QWaitCondition

QWaitCondition 类提供了一个条件变量用于线程同步。更多

概要

方法

注意

本文档可能包含从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:
Return type:

布尔

释放lockedMutex并等待条件。调用线程必须最初锁定lockedMutex。如果lockedMutex未处于锁定状态,则行为未定义。如果lockedMutex是递归互斥锁,则此函数立即返回。lockedMutex将被解锁,调用线程将阻塞,直到满足以下任一条件:

  • 另一个线程使用 wakeOne()wakeAll() 来发出信号。在这种情况下,此函数将返回 true。

  • 达到由deadline给出的截止时间。如果deadlineQDeadlineTimer::Forever(默认值),则等待将永远不会超时(事件必须被触发)。如果等待超时,此函数将返回false。

lockedMutex 将返回到相同的锁定状态。此函数用于允许从锁定状态到等待状态的原子转换。

另请参阅

wakeOne() wakeAll()

wait(lockedMutex, time)
Parameters:
  • lockedMutexQMutex

  • time – int

Return type:

布尔

这是一个重载函数。

释放lockedMutex并在等待条件上等待time毫秒。

wait(lockedReadWriteLock[, deadline=QDeadlineTimer(QDeadlineTimer.Forever)])
Parameters:
Return type:

布尔

释放lockedReadWriteLock并在等待条件上等待。lockedReadWriteLock必须最初由调用线程锁定。如果lockedReadWriteLock未处于锁定状态,此函数将立即返回。lockedReadWriteLock不得递归锁定,否则此函数将无法正确释放锁。lockedReadWriteLock将被解锁,调用线程将阻塞,直到满足以下任一条件:

  • 另一个线程使用 wakeOne()wakeAll() 来发出信号。在这种情况下,此函数将返回 true。

  • 达到由deadline给出的截止时间。如果deadlineQDeadlineTimer::Forever(默认值),则等待将永远不会超时(事件必须被触发)。如果等待超时,此函数将返回false。

lockedReadWriteLock 将返回到相同的锁定状态。此函数用于允许从锁定状态到等待状态的原子转换。

另请参阅

wakeOne() wakeAll()

wait(lockedReadWriteLock, time)
Parameters:
Return type:

布尔

这是一个重载函数。

释放lockedReadWriteLock并在等待条件上等待time毫秒。

wakeAll()

唤醒所有在等待条件上等待的线程。线程被唤醒的顺序取决于操作系统的调度策略,无法控制或预测。

另请参阅

wakeOne()

wakeOne()

唤醒一个在等待条件上等待的线程。被唤醒的线程取决于操作系统的调度策略,无法控制或预测。

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

另请参阅

wakeAll()