pyqt5主进程和子线程之间传递数据界面卡死!

错误:使用 pyqt5 画界面以后,想要用子线程的数据来更新主进程的界面,看起来没毛病,一运行,界面卡死。

原因:资源竞争。如果需要这样传递数据资源,一般是需要为这样的资源加互斥锁,避免两个线程争抢。因为主进程是一直在刷新界面资源的,如果在后续过程中,子线程去调用主进程的界面资源,就造成资源争抢了。

解决:可以采用槽函数的方式,子线程发送带有数据的信号,主进程接受信号,执行槽函数。
意味着,子线程不直接操作资源,而是发送信号给主进程,让主进程去更新界面,就不存在争抢资源的时刻。

代码示例如下:

from PyQt5.QtCore import QThread, pyqtSignal
from PyQt5.QtWidgets import QApplication, QLabel, QVBoxLayout, QWidget
import sys
import time

class Worker(QThread):
    signal = pyqtSignal(str)  # 定义一个信号,该信号在每秒钟发射一次,带有一个字符串参数

    def run(self):
        while True:
            time.sleep(1)
            self.signal.emit("Hello from thread")  # 发射信号,带有一个字符串参数

class Window(QWidget):
    def __init__(self):
        super().__init__()

        self.label = QLabel("Initial text")

        layout = QVBoxLayout()
        layout.addWidget(self.label)
        self.setLayout(layout)

        self.worker = Worker()
        self.worker.signal.connect(self.update_label)  # 连接信号到槽函数
        self.worker.start()

    def update_label(self, text):
        self.label.setText(text)  # 在主线程中更新标签的文本

app = QApplication(sys.argv)
window = Window()
window.show()
app.exec_()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值