永发信息网

Pyqt5如何停止多线程

答案:1  悬赏:0  手机版
解决时间 2021-03-15 10:00
Pyqt5如何停止多线程
最佳答案
以下用一个简单例子来表现如何用signal/slot信号槽来退出线程。
若有一个按钮,点击开始线程,再次点击退出线程,线程的工作为打印a(1-20)然后b(1-20),线程代码如下:
[python] view plain copy
class UpdateThread(QThread):  
def __init__(self, parent=None):  
super(UpdateThread, self).__init__(parent)  
self.flag = 1# 用来判断循环是否继续的标志,通过改变该标志来使得线程中run函数退出  
def run(self):  
table = ['a', 'b', 'c', 'd ', 'e', 'f', 'g']  
for i in range(6):  
if self.flag == 1:  
print table[i]  
for m in range(20):  
print m  
time.sleep(0.5)  
else:  
break  
print 'close'# 输出标明线程run函数已经退出  
def stop(self):  
print 'setting flag false'  
self.flag = 0  
print self.flag  
一开始因为python的threading没有线程退出的api,了解到QThread有实现线程的阻塞,退出,强制退出等api,于是就将线程继承了QThread,但是在gui界面的按钮逻辑中写上mythread.wait()或者是quit()还是terminate()都无法对线程产生影响(可能是当时没有使用信号槽机制,所以不起作用),然后自己来写一个stop函数用来修改线程中的一个标志,使得run函数中的循环停止,然后就如上代码所示,在按钮逻辑中如下所写(错误示范):[python] view plain copy
def update_db():# error  
self.new_thread1 = UpdateDbThread()  
if self.update_tag == 0:  
self.update_tag = 1  
self.new_thread1.start()  
else:  
self.update_tag = 0  
self.new_thread1.stop()  
运行之后发现stop函数虽然改变了self.flag的值,但是循环中判断语句中flag的值依然为1,循环并没有停止,然后就去查阅资料,以及上stackoverflow寻找答案,最终知道了线程需要通过信号槽机制来响应,所以便去查阅qt的signal/slot的相关信息,修改按钮代码如下:
[python] view plain copy
class mywidget(Qwidget):   
sin = pyqtSignal()# 提前申明  
def __init__(self):  
...  
self.new_thread1 = UpdateDbThread()  
self.sin.connect(self.new_thread1.stop)  
def update_db():  
if self.update_tag == 0:   
self.update_tag = 1  
self.new_thread1.start()   
else:   
self.update_tag = 0   
self.sin.emit()  


[python] view plain copy
  
pyqtSignal信号的定义不可以写在update_db方法中,也不可以写在init()初始化方法中,原因如下(来自stackoverflow):

所以我们就在init方法之前定义好信号sin,然后连接上线程的stop方法。点击按钮发送信号,就好改变线程的标志,然后从循环中退出,运行结果如下:
为了便于贴图,我将循环输出改为了10:

线程正常退出,目标达成。可以根据自己的需要重写run方法。


还有需要注意的是,不可以在方法中写上 mythread = update_db() ,这样在运行时会报错,destroyed while thread is running,因为在方法中mythread是一个局部变量,当方法结束时,python的垃圾回收机制就会自动销毁,然后就会出现以上错误,所以必须在mythread的前面加上self,使得线程成为全局变量。

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
安装vga分线器后,没有了1440*900这个分辨率
怎样形容那种那种,心理很自卑。总是觉得自己
凤岗到沙井怎么坐车?
城市水环境功能区水质达标由什么部门负责
代发沟地址在什么地方,想过去办事
昨天晚上做了乱七八糟的梦。梦到大姨妈纸上有
求一个PLC梯形图
柯岩中心小学这个地址在什么地方,我要处理点
证件被偷后,房产在自己不知情的情况下过户给
请问。康达五年制专转本出来第一学历是什么?
如何计划申请CalArts加州艺术学院
给女孩起名字,邵艺后面加什么字最好听???
小花照相在什么地方啊,我要过去处理事情
礼拜一坐飞机去澳大利亚留学~请问下澳航的随
怎么将苹果笔记本中的文件拷贝到优盘
推荐资讯
怎样自制黑蒜头?
本田 铃木水冷 小50助力踏板车,为什么不在中
洞庭山天然泉水专卖店(浒关店)地址有知道的么
CPU:I7 3370 主板:华硕P8Z77-V 内存:8G金士
理念路这个地址在什么地方,我要处理点事
星辰变里可用的特殊符号
又不认识字,又没有学历,能做什么呢!
狗狗最后一个乳头上长出个软包,怎么办
你好啊,我是焦作的,我今年要中考了,我很想
临沂赵八糁馆(蒙阴店)这个地址在什么地方,我
想知道: 您好,泰安市 从新泰汽车站南站或者
周星驰当八府巡按是什么电视
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?