我正在开发一个使用多线程从各种网络设备收集数据的应用程序。我正在使用 PyQT 在 GUI 上显示收集的数据。我在我的应用程序(而不是 QThread)中使用常规 python 线程(来自线程,线程)。为了在不同的线程上更新 GUI,我使用了一个锁 (thread.allocate_lock())。因此,无论何时发生 GUI 更新,我都会调用 lock, update GUI。对此有任何顾虑吗?
最佳答案
我很确定在 Qt 中从不同的线程更新 GUI 是危险的,即使您尝试在自己的代码中锁定内容。一方面,Qt 可能在主线程上进行自己的事件处理,它不会获取您的锁来保护它可能修改的对象。 On this page在 Qt 文档中,明确提到了 QWidget
不可重入或线程安全这一事实。
我建议您将收集的数据或其处理后的版本发布回主线程。使用排队的信号/槽连接,或自定义 QEvent
和 QApplication::postEvent
来执行此操作。在 jkerian 提到的前一个问题中,它说如果你想让事件发布正常工作,你必须使用 QThread
而不是 python 的线程。
关于python - PyQT 和线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3842558/