跟踪和管理qthreads。

safeqthreads的Python项目详细描述


[![构建状态](https://travis-ci.org/simongarisch/safeqthreads.svg?branch=master)(https://travis-ci.org/simongarisch/safeqthreads) < BR>[覆盖状态](https://coveralls.io/repos/github/simongarisch/safeqthreads/badge.svg?branch=master)(https://coveralls.io/github/simongarisch/safeqthreads?分支=主) < BR>[PYPI版本](https://badge.fury.io/py/safeqthreads.svg)(https://badge.fury.io/py/safeqthreads) < BR>
安全线程 < BR>
safeqthreads背后的动机是允许qthreads在应用程序退出之前完成。如果应用程序在qthread完成之前退出,python垃圾收集器将释放qthread并可能导致python崩溃。 < BR>
安装
safeqthreads与python 2和3兼容 'Br/''Bash
pip安装safeqthreads
< BR>
qthreads和python垃圾收集器(gc)
如果python gc在pyqt完成之前释放了一个qthread,那么这可能会导致python崩溃。下面是一个基本示例:
``巨蟒
如何使PYQT 101崩溃…
从pyqt5导入qtwidget,qtcore
导入时间 < BR>
定义targetfunc():
睡眠时间(5) < BR>
定义runthread():
线程=qtcore.qthread()
线程已启动。连接(targetfunc)
线程.start() < BR>
运行线程()
< BR>![Python崩溃](https://github.com/simongarisch/safeqthreads/blob/master/crash.png) < BR>
当pyqt应用程序在qthreads完成之前退出时,也会出现同样的问题。 < BR>
一些背景
有两种方法可以在pyqt中运行线程:
-python标准库中的[线程模块](https://docs.python.org/3/library/threading.html)
-使用pyqt中的[qthread](http://pyqt.sourceforge.net/docs/pyqt4/qthread.html) < BR>
使用pyqt时,qthreads选项允许您访问额外的pyqt功能,如信号和插槽。& BR&GT; < BR>
通过继承threading.thread类并重写run方法,我们可以使用标准库创建线程;您将看到许多这样实现的qthread示例,但它[不推荐](http://blog.qt.io/blog/2010/06/17/youre do it wrong/)。相反,建议使用其[MoveToThread]方法(http://pyqt.sourceforge.net/docs/pyqt4/qobject.html MoveToThread)创建一个工作线程(它继承自QObject)。我们将提供对两者使用safeqthreads的示例。 < BR>
将safeqthreads与线程和工作线程一起使用
safeqthreads.close_all_threads()是主函数末尾运行的最后一行。如果你评论这一行,那么你将有机会得到:
-警告"qthread:在ethread仍在运行时已销毁"
-python已停止工作(崩溃)
``巨蟒
导入时间
从pyqt5导入qtwidget,qtcore
导入safeqthreads < BR>
类更新签名(qtcore.qobject):
fire=qtcore.pyqtsignal(整数) < BR>
类someworker(safeqthreads.safeworker):
"做一些琐碎事情的工人
每秒递增一个计数器 'Br/'''
定义初始化(自我、线程、信号):
此线程将传递给安全工作者的构造函数

超级(某个工人,自己)。\uu init(线程)
self.signal=信号
自计数器=0 < BR>
定义回路(自):
如果为真:
如果自动停止运行:
返回
其他:
自计数器+=1
自发光信号(自计数器)
睡眠时间(3) < BR>< BR>
类主窗口(qtwidts.qmainwindow):
定义初始化(自身):
超级(主窗口,自身)。
self.setwindowtitle("主窗口") < BR>自行调整大小(300,300)
自我创建线程() < BR>
定义创建线程(自身):
创建信号
信号=self.signal=updateSignal()
信号。火灾。连接(自信号收集器) < BR>
然后创建safeqthread的实例
线程=self.thread=safeqthreads.safeqthread()
worker=self.worker=someworker(线程,信号) < BR>
http://pyqt.sourceforge.net/docs/pyqt4/qobject.html移动到线程
worker.moveToThread(线程)
线程.已启动.连接(worker.loop)
线程.start() < BR>
@qtcore.pyqtslot(整数)
def信号采集器(自身,计数器):
自我设置窗口标题(str(counter)) < BR>< BR>
def main():
app=qtwights.qapplication([])创建应用程序实例
win=mainwindow()
win.show()显示窗口
app.exec()进入app mainloop
safeqthreads.close_all_threads()35;<;--注释我并查看发生了什么 < BR>< BR>
如果uuu name_uuuu=="uuu main_uuu":
主()
< BR>
这是我在注释"safeqthreads.close_all_threads()"前后的终端。 < BR>![线程已销毁](https://github.com/simongarisch/safeqthreads/blob/master/commenting_out.png) < BR>
使用safeqthreads并从qthread继承
如前所述,这不是推荐的方法。使用worker和moveToThread()代替上面的详细说明。在任何情况下,下面是一个示例,我们从qthread继承并重写run方法。
``巨蟒
导入时间
从pyqt5导入qtwidget,qtcore
导入safeqthreads < BR>
类更新签名(qtcore.qobject):
fire=qtcore.pyqtsignal(整数) < BR>< BR>
类somethread(safeqthreads.safeqthread):
定义初始化(自,信号):
超级(一些线程,自身)。
self.signal=信号
自计数器=0
自启动() < BR>
定义运行(自):
''这执行起来像我们的worker.loop方法
上一个例子中的''
如果为真:
如果自动停止运行:
返回
其他:
自计数器+=1
自发光信号(自计数器)
睡眠时间(3) < BR>< BR>
类主窗口(qtwidts.qmainwindow):
定义初始化(自身):
超级(主窗口,自身)。
self.setwindowtitle("主窗口")
自行调整大小(300,300)
自我创建线程() < BR>
定义创建线程(自身):
信号=self.signal=updateSignal()
信号。火灾。连接(自信号收集器)
thread=self.thread=somethread(signal)并创建我们的线程 < BR>
@qtcore.pyqtslot(整数)
def信号采集器(自身,计数器):
自我设置窗口标题(str(counter)) < BR>< BR>
def main():
app=qtwights.qapplication([])创建应用程序实例
win=mainwindow()
win.show()显示窗口
app.exec()进入app mainloop
安全线程。关闭所有线程() < BR>< BR>
如果uuu name_uuuu=="uuu main_uuu":
主()
< BR>< BR>< BR>

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
HTTP标头的java InputStream未终止   java测试SpringWebListener   具有定义的替换编号Java的regex ReplaceAll   在java中使用contains()方法   java在选择查询中使用JoinColumn字段   具有用户的java Start-stop demon不是以给定用户启动   java glBufferData生成GL\u无效\u操作   java中循环代码的循环   Java位无符号移位(>>>>)会产生奇怪的结果   java HQL使用点分隔符从select获取结果   条纹、弹簧、玩耍(或?):使用哪种高性能Java框架?   广播接收机中的java停止服务   java回收器视图占据整个屏幕。不在上面显示我的UI元素   java使MySQL查询更快   java MappedByteBuffer查询   java递归算法问题