【问题标题】:Safe and lazy method invocations in PySide/PyQtPySide/PyQt 中的安全和惰性方法调用
【发布时间】:2011-09-03 13:41:49
【问题描述】:

我正在使用 PySide 管理一些硬件并根据(例如)界面中的按钮点击执行一些相对简单的操作。运行这些硬件的代码驻留在另一个线程中。为方便起见,我向所有这些硬件驱动程序添加了一个通用的invoke_method 信号,以便 UI 组件可以使用

my_driver.invoke_method.emit('method_name', [arg, ...], {kwarg, ...})

显然,这会直接访问其他线程中的信号属性....但我不确定这在 GIL 世界中是否一定可以。

如果这确实是一个懒惰的解决方案 - 是否有任何其他很好的替代方案可以在任意线程中调用任意方法,而无需将 UI 中的特定于操作的信号连接到驱动程序中的另一个信号?

我可以想象在 UI 代码的每一位中使用一个信号来访问不同的硬件 - 例如 do_invocation_driver_1do_invocation_driver_2 并将它们连接到相应驱动程序的 invoke_method 信号。

【问题讨论】:

    标签: python thread-safety pyqt pyside


    【解决方案1】:

    我建议阅读this post,了解使用 PyQt GUI 接口线程的一般方法。这篇文章讨论了一个执行套接字 I/O 的线程,但这确实适用于任何线程。具体来说,硬件接口线程通常也使用 I/O,所以这可能是一个不错的选择。

    所讨论的方法非常通用,使用Queue.Queue,对于简单的任务可能看起来有点过头了(但我只想在线程中调用“那个”函数)。但是,一旦您的应用程序变得不平凡,您就会喜欢它,因为它避免了任何线程同步问题,并且具有很强的可扩展性。我个人用它来实现复杂的 PyQt GUI,并使用侧线程做各种事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-26
      • 1970-01-01
      • 2022-11-16
      • 1970-01-01
      相关资源
      最近更新 更多