在 PyQt 应用程序中的主窗口和线程之间共享数据
线程对于执行任务而不阻塞主窗口非常有用。然而,在线程内从主窗口访问数据提出了挑战。让我们探索使用 PyQt 进行数据共享的适当方法。
低效方法:
1。将窗口引用传递给线程:
虽然这允许直接访问主窗口变量,但它违反了线程安全原则。小部件不可重入,只能从主线程访问。
2.维护线程同步变量副本:
这种方法需要频繁的数据同步,导致代码复杂性和潜在的竞争条件。
3.使用全局变量:
在多线程环境中不建议使用全局变量。同时访问它们可能会导致不可预测的结果。
推荐方法:
使用信号和槽:
这是 PyQt 中推荐的方法。信号和槽为线程之间的通信提供了线程安全的机制。以下步骤概述了如何使用信号和时隙进行数据共享:
1.在工作线程中创建信号:
# in worker thread
class Worker(QtCore.QThread):
...
# Create signal named "beep"
beep = QtCore.pyqtSignal(int)
2.从工作线程发出信号:工作线程中的
# in worker thread
def run(self):
...
# emit "beep" signal with current count
self.beep.emit(count)
3.在主窗口中将插槽连接到信号:
# in main window
self.worker = Worker(self.spinbox.value())
self.worker.beep.connect(self.update) # update槽函数
4.在主窗口中实现插槽功能:
# in main window
def update(self, count):
...
# update GUI elements using count
5. 更新 GUI 元素。从主窗口更新共享数据:
# in main window
self.spinbox.valueChanged.connect(self.worker.update_value) # update_value槽函数
6.在工作线程中实现槽函数:
# in worker thread
class Worker:
...
def update_value(self, value):
# Update sleep time in worker thread
通过执行以下步骤,您可以安全高效地在 PyQt 应用程序中的线程和主窗口之间共享数据。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3