gpt4 book ai didi

python - PyQt 信号中的保证和使用队列的比较

转载 作者:行者123 更新时间:2023-12-01 07:56:35 25 4
gpt4 key购买 nike

我正在考虑两种机制来在应用程序的不同线程之间传递结果。一种可能性是创建一个由一个线程填充并由该线程消耗的 Python 或 PyQt 队列。但我也可以使用 PyQt Signal/Slots 来达到相同的目的。后者的优点是我可以拥有多个消费者而无需任何额外的工作,但我想知道是否有一个缺点。特别是,

  1. 信号是否保证被中继到连接的插槽,或者它们可能会丢失?
  2. 是否保证信号的接收顺序与发出的顺序相同?

最佳答案

<强>1。信号是否保证被中继到连接的插槽或者它们可能会被丢失?

Qt 保证槽接收到信息。在 Qt 的后台,信号位于由事件循环处理的队列中,这是一个优点,因为队列可以访问连接。

<强>2。是否保证信号按照发出的顺序接收?

正如我之前的回答中的信号一样,Qt 将要传输的信息保存在队列中。您还必须知道,仅当同步任务结束或某些辅助线程处于 sleep 状态时才会调用插槽。然后,为了检查顺序是否得到遵守,我们可以使用以下示例,其中发出 5 个信号,并在 sleep 中调用该插槽。

from PyQt5 import QtCore


class FooObject(QtCore.QObject):
foosignal = QtCore.pyqtSignal(int)

@QtCore.pyqtSlot()
def run(self):
counter = 0
for _ in range(10):
for i in range(5):
self.foosignal.emit(counter)
counter += 1
QtCore.QThread.sleep(1)


if __name__ == "__main__":
import sys

app = QtCore.QCoreApplication(sys.argv)
foo = FooObject()
thread = QtCore.QThread()
thread.start()
foo.moveToThread(thread)
foo.foosignal.connect(print)
QtCore.QTimer.singleShot(1000, foo.run)
sys.exit(app.exec_())

关于python - PyQt 信号中的保证和使用队列的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55940949/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com