pyqt通过信号槽机制来退出线程
来源:互联网 发布:算法统宗中的歌诀题 编辑:程序博客网 时间:2024/04/30 13:58
刚刚解决了pyqt线程退出问题,特来此记录下解决的想法。以下用一个简单例子来表现如何用signal/slot信号槽来退出线程。
若有一个按钮,点击开始线程,再次点击退出线程,线程的工作为打印a(1-20)然后b(1-20),线程代码如下:
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
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的相关信息,修改按钮代码如下:
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()
</pre><p></p><pre>
pyqtSignal信号的定义不可以写在update_db方法中,也不可以写在init()初始化方法中,原因如下(来自stackoverflow):
所以我们就在init方法之前定义好信号sin,然后连接上线程的stop方法。点击按钮发送信号,就好改变线程的标志,然后从循环中退出,运行结果如下:
为了便于贴图,我将循环输出改为了10:
线程正常退出,目标达成。可以根据自己的需要重写run方法。
还有需要注意的是,不可以在方法中写上 mythread = update_db() ,这样在运行时会报错,destroyed while thread is running,因为在方法中mythread是一个局部变量,当方法结束时,python的垃圾回收机制就会自动销毁,然后就会出现以上错误,所以必须在mythread的前面加上self,使得线程成为全局变量。
请尊重作者劳动,文章禁止转载。
如需转载,向本人说明后,经过同意方可,转载附加上本文章原地址。
1 0
- pyqt通过信号槽机制来退出线程
- 信号和槽-Pyqt
- PyQT之信号槽
- pyqt信号与槽
- PyQt GUI--信号与槽
- pyqt自定义信号与槽
- qt线程通信(通过信号触发来传递参数)
- PYQT 可直接通过信号槽,或者 invokeMethod 直接访问QT库的C++插件.
- pyQt不同窗体间的值传递(二)——使用信号槽机制
- PyQt基础第2篇——信号槽机制实现和简析
- pyqt信号和槽传递额外参数
- pyqt 信号与槽的理解
- pyqt中信号,槽的使用方法
- PyQt 信号和槽传递额外参数
- pyqt信号和槽传递额外参数
- 线程的主动退出机制
- 线程间同步机制----信号
- 线程中建立新线程,退出机制
- platform模型驱动编程总结
- VI分屏显示
- object—c runtime 经典讲解系列二
- android 将对象存储于本地
- Android NDK r10e
- pyqt通过信号槽机制来退出线程
- 深入理解python之self
- linux copy_from_user/copy_to_user
- iOS开发网络篇—文件下载---进度条提示
- 2.28SwapNodesinPairs
- C语言printf数字输出格式
- tableviewcell xib 使用 autolayout 从 -8 开始
- Rightmost Digit ---关于hdu-1061
- Objective-C Runtime 经典讲解系列三