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

时间:2019-05-01 18:33:35

标签: python pyqt pyqt5 signals-slots

我正在考虑两种在应用程序的不同线程之间传递结果的机制。有可能创建一个由一个线程填充并由该线程使用的Python或PyQt队列。但是我也可以出于相同的目的使用PyQt信号/插槽。后者的优点是我可以拥有一个以上的消费者,而无需进行任何额外的工作,但是我想知道是否存在不利之处。尤其是

  1. 是否保证信号会中继到连接的插槽,否则可能会丢失?
  2. 是否保证信号的发送顺序相同?

1 个答案:

答案 0 :(得分:0)

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_())