我是靠谱客的博主 自觉蜗牛,最近开发中收集的这篇文章主要介绍pyqt5 多线程遇到的问题总结前言,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

前言

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

# 多线程的实现
class MyThread(QThread):
_signal = pyqtSignal(object)
# 自定义信号,用于传递数据等
def __init__(self):
super().__init__()
# 重写run函数
def run(self):
# 需要在子线程运行的程序
...

1. 退出子线程

    有时候我们不希望程序运行到结束,我们需要程序提前终止,这时候我们需要提前退出子线程。
方法:定义一个停止标志flag,重写stop函数。退出线程直接调用stop函数让flag不满足循环条件,退出循环。

# 多线程的实现
class MyThread(QThread):
_signal = pyqtSignal(object)
# 自定义信号,用于传递数据等
def __init__(self):
super().__init__()
self.stop_flag = False
# 重写run函数
def run(self):
for i in range(10):
if self.stop_flag is True:
return/(break)
else:
self._signal.emit(i)
self._signal.emit("程序运行结束!")
def stop(self):
self.stop_flag = True
class UIwindow(QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.pushButton.clicked.connect(self.stop_thread)
# 提前停止线程
self.pushButton_2.clicked.connect(self.start_thread)
# 开启线程
def start_thread(self):
# 创建线程
self.thread = MyThread()
self.textBrowser.append("程序正在运行中... ")
self.thread._signal.connect(self.receive)
self.thread.stop_flag = False
self.thread.start()
def stop_thread(self):
self.thread.stop()
def receive(self, i):
"""
接收线程发射的信号
"""
precent = "■" * (i + 1) + "□" * (9 - i)
self.textBrowser.setText("生成数据中...
{}% |".format((i + 1) * 10) + precent + "|")

2. 报错 QThread :Destroyed while thread is still running!

方法1在调用线程的时候一定要加self,因为不加self,是局部变量,函数运行后,python的垃圾自动回收机制会将局部变量回收掉。

thread = MyThread()
更改为:
self.thread = MyThread()

方法2在线程开启后面加self.exec()

self.thread = MyThread()
self.thread.start()
self.thread.exec()

方法3退出线程的时候报这个错误,在线程stop函数中加入下面语句


def stop(self):
self.stop_flag = True
# 加入下面语句
self.requestInterruption()
self.wait()

3. 退出线程后,再次开启线程时程序不运行

线程锁(QMutex)的问题
    因为线程中用了线程锁的原因,导致退出线程后,再次开启线程后,程序不会接着运行的问题。将线程锁取消掉成功解决。

4. pyqt5不报具体的错误,直接闪退

更新:最近发现了一个调试库,可以显示pyqt的错误,而且界面也不会闪退,在代码中加入下列代码即可。

 import cgitb
cgitb.enable(format='text')

解决方法:在终端(命令行)运行程序,就可以正常的显示错误了。
          Pycharm的话,在Terminal处运行就可以了。
推荐可以使用try,except语句。既可以发现错误,也不会导致界面频繁闪退!

try:
...
return
except Exception as reason:
return QMessageBox.warning(self, 'Warning', str(reason))

5. 利用自定义信号传递数据和参数

_finished = pyqtSignal(object)
# 自定义信号
(int)------>传递整型数据
(str)------>传递字符型数据
(object)------>不确定类型的时候可以用这个,可以传递numpy、字典等类型数据

最后

以上就是自觉蜗牛为你收集整理的pyqt5 多线程遇到的问题总结前言的全部内容,希望文章能够帮你解决pyqt5 多线程遇到的问题总结前言所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部