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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在PyQt中,如果在主界面线程中执行耗时操作,会导致界面卡死的问题。这是因为PyQt应用程序是基于事件驱动的,主线程负责处理GUI事件。当有耗时的操作任务时,GUI事件会被阻塞,导致应用程序处于假死状态,无法与应用程序进行交互。为了解决这个问题,可以采用多线程的方式。一种方式是继承自QThread类,将耗时的操作放在子线程中进行处理,然后通过signal-slot机制将子线程的数据反馈到主界面线程中。需要注意的是,在子线程中不能操作界面,只能处理数据。这样可以将UI的操作与耗时数据的处理进行分开处理,避免了界面卡死的问题。另一种方式是使用RunThread类继承自QObject,而非继承自QThread。这种方式将数据的处理与线程的创建与启动分开进行处理,适用于某些场景下比较方便。虽然这种方式比较复杂,但在特定情况下可以更灵活地使用多线程。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *2* [PyQt - 使用多线程避免界面卡顿](https://blog.csdn.net/bailang_zhizun/article/details/109240670)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [解决PySide6/PyQT界面卡死问题(PySide6/PyQT线程](https://blog.csdn.net/weixin_45081575/article/details/130210522)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值