保证PyQt信号和比较使用队列

问题描述 投票:1回答:1

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

  1. 是保证信号被转发到连接的插槽还是可以错过?
  2. 是否保证按照发出的顺序接收信号?
python pyqt pyqt5 qt-signals
1个回答
1
投票

1.信号是否保证被转发到连接的插槽或者可以丢失?

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

2.保证按照发出的顺序接收信号吗?

由于我之前的答案Qt中的信号保存了将在队列中传输的信息。您还必须知道仅在同步任务结束或某些辅助线程中存在休眠时才调用插槽。然后,为了检查订单是否得到遵守,我们可以使用以下示例,其中发出5个信号发射,并在睡眠中调用插槽。

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_())
© www.soinside.com 2019 - 2024. All rights reserved.