在子线程中创建一个异常信号,然后在子线程中捕获异常,如果子线程任务出现了异常就emit这个异常信号,在主UI线程中connect这个异常信号,如果接收成功了就说明子线程有异常,就可以对其进行相应的操作(直接关闭进度条)。
部分代码:
class ProcessDialog(QDialog):
def __init__(self):
super(ProcessDialog,self).__init__()
self.resize(300,100)
vBox = QVBoxLayout()
label = QLabel("处理中...",self)
self.pbar = QProgressBar()
self.pbar.setMaximum(100)
self.timer = QBasicTimer()
self.step = 0
vBox.addWidget(label)
vBox.addWidget(self.pbar)
self.setLayout(vBox)
self.setWindowTitle('提示')
self.timer.start(10, self)
self.setWindowFlags(Qt.WindowStaysOnTopHint)
self.setWindowModality(Qt.ApplicationModal)
self.setWindowFlags(Qt.WindowCloseButtonHint)
def timerEvent(self, e):
if self.step >= 100:
self.quit()
return
def quit(self):
QApplication.processEvents()
self.step = 0
self.pbar.setValue(self.step)
self.timer.stop()
self.close()
class Mythread(Qthread):
finish = pyqtSignal(np.ndarray,int)
excepted = pyqtSignal(str)
def __init__(self):
super(Mythread, self).__init__()
def run(self):
try:
for i in range(100):
self.finish.emit(image,i+1)
except Exception as e:
self.excepted.emit(str(e))
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.myThread = MyThread()
self.myThread.finish.connect(self.fun)
self.myThread.excepted.connect(self.threadException)
self.processDiaog = ProcessDialog()
if not self.processDiaog.exec_():
self.myThread.terminate()
def fun(image,step):
self.processDiaog.step = step
self.processDiaog.pbar.setValue(step)
def threadException(self,message):
self.processDiaog.quit()
print(message)
前面在pyqt5多线程(QThread)遇到的坑(一)中提到了先实例化类,再把实例对象传参到线程类,这样的确实可行,但是还是遇到了新坑。
pyqt5多线程(QThread)遇到的坑(一
被实例化的类是做数据处理的,传入和导出的的数据比较大,最少都是几万行的excel表格数据(pandas.DataFrame),而且传入的数据最少两个pandas.DataFrame表,多的时候会传入7个,而且有一些数据是公共数据,每次处理都必须处理的,直接放在数据处理类的初始化__init__中了,而这部分数据处理也是稍微有的耗时,那么坑就来了,先实例化数据处理类,那么这部分稍微耗时的数据处理也会导
一、多进程 的 共享内存——Value 和 Array一般的变量在进程之间是没法进行通讯的,multiprocessing提供了Value和Array模块,他们可以在不通的进程中共同使用。主进程的内存空间中创建共享的内存,也就是Value和Array两个对象。对象Value被设置成为双精度数(d), 并初始化为0.0。而Array则类似于C语言中的数组,有固定的类型(i, 也就是整数)。fro...
总结来说,QThread 中线程的退出原理是通过调用线程的 quit 或 exit 方法请求线程退出,然后等待线程的 run 方法执行完毕后发出 finished 信号,可以在该信号的槽函数中执行一些清理操作。quit 方法会请求线程退出,但不会立即终止线程的执行,而是等待线程执行完 run 方法后再退出。线程的退出信号:QThread 提供了一个 finished 信号,当线程的 run 方法执行完毕时,会自动发出这个信号。run 方法:QThread 中的线程逻辑主要在 run 方法中实现。
问题:点击<开始>按钮后加载模型计算,pyqt界面卡住等待计算结束。目的是添加进度条,优化用户等待。一开始以为添加进度条加上时钟就行,调试后发现把计算部分写在主界面类里,计算和进度条无法一起进行。
解决:需要把计算部分分离出去另起一个线程。
线程类的结构
以我程序所写的线程类为参考如下
from PyQt5.QtCore import *
class MyCal(QThread):
目录一、界面卡死与多线程相关1、PyQt5中使用线程QThread和Thread进行耗时操作的问题2、pyqt5 的多线程(QThread)遇到的坑二、部件性能与展示相关1、QTextEdit、QTextBrowser添加的文字超出视图后,滑动条自动移至最底部显示最新文本的解决办法三、常用功能实现的代码技巧1、python定时程序(每隔一段时间执行指定函数)四、pycharm常见报错1、Pycharm报:Method ‘XXX’ may be ‘static‘ 的解决办法2、Pycharm报:This di
所以认真的研究了一下这个问题,下面给出一个具体实验环境(qt5),即可说明问题.
简单期间,直接上代码, 分三部分,header文件,cpp文件,pro文件, 重点在主窗口的析构,说明如何停止线程的运行.
header 文件
cat *.h
#ifndef _CLOCK_THREAD_H
#define _CLOCK_THREAD_H
#incl
如下是一个爬虫的部分代码,现在碰到的问题是,多个线程(比如10个)中的某个在爬取、解析某个页面或者存储数据的过程中发生了异常,子线程的工作代码虽然捕捉了这一异常,但无法继续工作。我希望最好有办法能不让线程退出,而继续分配给他的工作;退而求其次,可以开启一个新的线程继续他的工作,但这需要发生异常的线程将退出节点的信息返回给主线程;最次的,异常退出的线程应该将退出节点的信息返回并让主线程记录,方便我后...