最近在做一个系统。对代码进行主线程和子线程的分离,将比较耗时的数据处理操作放在子线程里面操作,防止卡死。由于最后系统使用的环境很杂,pyqt5版本过高,在一些xp的低版本操作系统是运行会出问题,所以使用的pyqt4,但原理一样。
原理参考博文最后链接,这里记录自己的使用方法
比如,在通过实现制作TFrecords文件,并记录文件照片数量。这里有循环读取的耗时操作。利用多线程实现如下:
步骤:
1.创建线程类
from PyQt4 import QtCore
from PyQt4.QtCore import pyqtSignal
class WorkThread(QtCore.QThread):#定义一个工作线程,后面会调用和重写
# 使用信号和UI主线程通讯,参数是发送信号时附带参数的数据类型,可以是str、int、list等
finishSignal = pyqtSignal(int)
def run(self):#线程启动后会自动执行,这里是逻辑实现的代码
self.finishSignal.emit(int) #发射信号
WorkThread是创建的一个线程类,后面会重写他的run方法
实现制作数据集的操作:
class dealThread(WorkThread): #1.制作数据集
finishSignal = pyqtSignal(int,int)
# 带3个参数
def __init__(self,dataset_param,total_label,tf_record):
super(dealThread, self).__init__()
self.datasetparam_ui = dataset_param
self.totalnum_label = total_label
self.Tfrecord_ui = tf_record
#处理逻辑业务
def run(self):
try:
if self.datasetparam_ui.tfrecordstart_radioButton.isChecked():# Tfrecord文件
saveTfrecord_path = self.datasetparam_ui.datasetsavepath_label.text() # 保存路径
ftrecordfilename = ("train.tfrecords") # tfrecords格式文件名
# 通过这一句将数据写入到TFRecord文件,参数为TFrecord的文件路径,入口
writer = tf.io.TFRecordWriter(saveTfrecord_path + "\\" + ftrecordfilename)
# 标签
with open(self.datasetparam_ui.csvlabel_label.text(), 'r') as ff:
reader = csv.reader(ff)
images_list = []
labels = []
for row in reader:
images_list.append(row[0])
labels.append(row[1])
ff.close()
lines = 1
bad = 0

最低0.47元/天 解锁文章
3579





