我正在构建一个小型GUI应用程序,它运行一个producer(worker),GUI按需使用输出并绘制输出(使用pyqtgraph)。在
由于producer是一个阻塞函数(需要一段时间才能运行),所以我(应该)将它移动到它自己的线程中。在
打电话时QThread.currentThreadId()它从producer输出与主GUI线程相同的数字。因此,首先执行worker,然后执行所有的绘图函数调用(因为它们正在同一线程的事件队列中排队)。我该怎么解决这个问题?在
部分运行示例:
gui thread id 140665453623104
worker thread id: 140665453623104
以下是我的完整代码:
^{pr2}$
问题是Qt试图根据} 没有帮助。在
slot
所在的线程选择连接类型(当您调用signal.connect(slot)
)时。因为您已经用partial
将插槽包装在QThread中,所以要连接的插槽位于主线程(GUI线程)中。您可以重写连接类型(作为connect()
的第二个参数),但这没有帮助,因为partial
创建的方法将始终存在于主线程中,因此将连接类型设置为by ^{我能看到的唯一解决方法是设置一个中继信号,其唯一目的是有效地将没有参数的发射信号(例如从按钮单击的信号)更改为具有一个参数(您的
m
参数)的信号。这样,您就不需要用partial()
来包装QThread中的插槽。在代码如下。我在主windows类中创建了一个带有一个参数(int)的信号,称为'relay'。button
clicked
信号连接到主窗口类中的一个方法,这个方法有一行代码,它发出我创建的自定义信号。您可以扩展此方法(relay_signal()
)以获得要传递给QThread的整数m
(本例中为500),从任何地方开始!在代码如下:
我还修改了
graficar
方法,以便在队列中仍有数据时继续绘制(即使在线程终止之后)。我想这可能就是为什么您需要在QThread中使用time.sleep
,它现在也被删除了。在另外,关于代码中关于
moveToThread
放置位置的注释,它现在的位置是正确的。它应该在将QThread slot连接到信号的调用之前,其原因在这个堆栈溢出帖子中讨论:PyQt: Connecting a signal to a slot to start a background operation相关问题 更多 >
编程相关推荐