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