PyQt5多线程以及其他注意事项

编写Qthread实现多线程

        在使用pyqt5时,程序运行时间过长可能会造成界面假死的情况,为了解决这个问题,可以采用Qthread多线程。将耗时的程序放到子线程中运行。
    pyqt5 多线程用法是继承QThread类,然后重写run()函数实现。

        如下函数仅仅是举例子,根据自己的程序做相应的更改就可以,将耗时操作的函数放在多线程中进行调用即可。

        下面使用多线程时,还使用了自定义槽函数,也可以不使用,直接定义一个类,将print输出的语句直接打印到相应的显示窗口即可

class RunConnect(QThread):
    # 设置发射信号类型为str
    _connect_status = pyqtSignal(str)       # 信号类型 str

    def __init__(self, telnetObj, host, port):
        super(RunConnect, self).__init__()
        self.telnetObj = telnetObj
        self.host = host
        self.port = port

    def run(self):
        try:
            # 耗时操作的函数,放在这里执行
            self.telnetObj.open(host=self.host, port=self.port, timeout=10)
            self._connect_status.emit('Connect successfully\r')
        except Exception as e:
            self._connect_status.emit(f'连接失败:{e}\r')
            # return '连接失败'

定义完成后,在主程序中进行调用时,参照如下

这里有一个坑要注意,在主程序实例化多线程时,一定要加self,因为不加self,是局部变量,函数运行后,python的垃圾自动回收机制会将局部变量回收掉。

程序会直接crash,这个错误也不好排查

一定注意!!!

一定注意!!!

一定注意!!!

class test():
    def __init__():
        pass
    def demo():
        self.connectObj = RunConnect(self.tn, host, port)  # 创建一个线程
        self.connectObj._connect_status.connect(self.ptePrintText)  # 线程连接到槽函数
        self.connectObj.start()        # 启动


    # QPlainTextEdit更新信息的槽函数
    def ptePrintText(self, newText):
        cursor = self.show_pte.textCursor()
        cursor.movePosition(QTextCursor.End)
        cursor.insertText(str(newText))  # 该方法只可以插入文本,不会显示HTML标签
        # cursor.insertHtml(text)
        self.show_pte.setTextCursor(cursor)
        self.show_pte.ensureCursorVisible()

关闭窗口时,要做某些操作

如果想关闭窗口时,做某些操作,例如,保存配置,或者其他等等,一定不要执行耗时的操作,大量参数的比较,这样会使关闭动作延迟,使用感受不好,如果想关闭窗口时,保存配置,最好不管参数有没有变化,都直接写入到配置文件即可,不进行比较操作,这样反而会降低效率。

参考:pyqt5 多线程遇到的问题总结_来一打雪碧-CSDN博客_pyqt5多线程崩溃

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值