问题
在编写一个软件的过程中,有个读文件处理数据的功能十分耗时,处理时间可能要15分钟左右。若采用单线程,那么在执行这个功能的时候,便不能点击软件的其他部分,否则就会出现软件卡死的情况,用户体验感极差。
解决
采用多线程的方法,重开一个线程在后台执行这个功能,前段主线程执行其他的功能。
代码
新建一个线程类,继承自QThread类
from PyQt5.QtCore import QThread, pyqtSignal
from NewSource.ExtractSourceCode import * #耗时函数所在的包文件
class WorkThread(QThread):
# 使用信号和UI主线程通讯
signal_over = pyqtSignal(list) #给主线程传递函数执行结束的返回值,list表示返回值类型是列表
def __init__(self, in_path='', parent=None): #in_path是函数执行所需的参数,默认为空
super(Delay_ns, self).__init__(parent)
self.in_path = in_path #设置函数文件读取路径
def run(self): #固定函数,不可变,线程开始自动执行run函数
source,jiema,yuzhi = decode(self.in_path) #decode函数即为耗时函数,函数有三个返回值
li = [source,jiema,yuzhi] #将返回值添加到列表
self.signal_over.emit(li) #发射列表信号,表示线程结束
return
主函数main.py文件中首先引用该类所在文件,然后修改代码如下:
def longtime(self): #前端按钮控制的原耗时函数的槽函数
in_path= self.lineEdit.text()
print('我按下了按钮')
self.decodethread = WorkThread(in_path) #传入文件地址
self.decodethread.signal_over.connect(self.thread_decode_over)
print('延时线程开始,函数退出')
self.decodethread.start() # 启动线程
# self.source, self.jiema, self.yuzhi = decode(in_path) #原来执行函数的语句
print("解码")
def thread_decode_over(self,list):
self.source,self.jiema,self.yuzhi = list[0],list[1],list[2]
del self.delay
效果
运行这个函数的同时可以同时运行其他的函数。