我正在使用PySide管理一些硬件并执行一些相对简单的操作,具体取决于(例如)界面中的按钮点击。运行这些硬件的代码驻留在另一个线程中。为方便起见,对于所有这些硬件驱动程序,我添加了一个通用invoke_method
信号,以便UI组件可以使用
my_driver.invoke_method.emit('method_name', [arg, ...], {kwarg, ...})
显然,这会直接访问其他线程中的signal属性....但我不确定这在GIL世界中是否一定正常。
如果这确实是一个太懒的解决方案 - 是否有任何其他很好的选择来在任意线程中调用任意方法而不必在UI中连接到驱动程序中的另一个信号的特定于操作的信号?
我可以想象在UI代码的每一位中使用一个信号来访问不同的硬件 - 例如do_invocation_driver_1
和do_invocation_driver_2
,并将它们连接到invoke_method
的{{1}}信号。相应的司机。
答案 0 :(得分:4)
我建议阅读this post以获得使用PyQt GUI连接线程的一般方法。该帖子讨论了一个执行套接字I / O的线程,但这确实适用于任何线程。具体来说,硬件接口线程通常也使用I / O,因此这可能是一个不错的选择。
所讨论的方法非常通用,使用Queue.Queue
,对于简单的任务来说似乎有些过分(但我只想在线程中调用“that”函数)。但是,一旦您的应用程序变得非常重要,您将会欣赏它,因为它可以避免任何线程同步问题,并且具有很高的可扩展性。我个人用它来实现复杂的PyQt GUI,侧面线程做各种各样的事情。