可以用共享变量和加锁的。Python 和 Qt 的线程都是对应系统的线程,只是系统线程 API 的包装。
还有个办法是使用 QMetaObject::invokeMethod(),从子线程调用 UI 线程的方法。要求有事件循环。比如这样写:
QMetaObject.invokeMethod(
DeferCallThread.mainThreadStub, # 一个 QObject 对象
"_slot_callback", # 它的一个方法名
Qt.QueuedConnection, # 固定取值
Q_ARG("PyQt_PyObject", self.done), # 参数1,必须是 PyQt_PyObject
Q_ARG("PyQt_PyObject", result), # 参数2, 必须是 PyQt_PyObject
)
打个广告吧,大多数 PyQt 使用线程是为了访问网络,这种情况下,可以看看我弄的 PyQt 协程。没有开线程,而是在 eventlet 协程里面访问网络,得到数据可直接更新 GUI 不卡 UI 无需加锁很方便:
https://github.com/hgoldfish/eventlet-pyqt
【 在 codelover 的大作中提到: 】
: 再请教一个:其他线程和qt线程之间通信,是不是只能用pyqtSignal,不能用共享变量和加锁机制那一套
: --来自微微水木3.5.12
--
FROM 112.47.122.*