self
.
layout
=
QVBoxLayout
(
self
)
self
.
progressBar
=
QProgressBar
(
)
self
.
btnBegin
=
QPushButton
(
"开始"
)
self
.
btnPause
=
QPushButton
(
"暂停"
)
self
.
btnPause
.
setEnabled
(
False
)
self
.
btnResume
=
QPushButton
(
"恢复"
)
self
.
btnResume
.
setEnabled
(
False
)
self
.
btnCancel
=
QPushButton
(
"取消"
)
self
.
btnCancel
.
setEnabled
(
False
)
self
.
layout
.
addWidget
(
self
.
progressBar
)
self
.
layout
.
addWidget
(
self
.
btnBegin
)
self
.
layout
.
addWidget
(
self
.
btnPause
)
self
.
layout
.
addWidget
(
self
.
btnResume
)
self
.
layout
.
addWidget
(
self
.
btnCancel
)
"""信号绑定"""
self
.
btnBegin
.
clicked
.
connect
(
self
.
__onClickedBtnbegin
)
self
.
btnPause
.
clicked
.
connect
(
self
.
__onClickedBtnpause
)
self
.
btnResume
.
clicked
.
connect
(
self
.
__onClickedBtnresume
)
self
.
btnCancel
.
clicked
.
connect
(
self
.
__onClickedBtncancel
)
def
__onClickedBtnbegin
(
self
)
:
self
.
btnBegin
.
setEnabled
(
False
)
self
.
btnPause
.
setEnabled
(
True
)
self
.
btnResume
.
setEnabled
(
False
)
self
.
btnCancel
.
setEnabled
(
True
)
self
.
thread
=
Thread
(
)
self
.
thread
.
valueChange
.
connect
(
self
.
progressBar
.
setValue
)
self
.
thread
.
start
(
)
def
__onClickedBtnpause
(
self
)
:
self
.
btnBegin
.
setEnabled
(
False
)
self
.
btnPause
.
setEnabled
(
False
)
self
.
btnResume
.
setEnabled
(
True
)
self
.
btnCancel
.
setEnabled
(
True
)
self
.
thread
.
pause
(
)
def
__onClickedBtnresume
(
self
)
:
self
.
btnBegin
.
setEnabled
(
False
)
self
.
btnPause
.
setEnabled
(
True
)
self
.
btnResume
.
setEnabled
(
False
)
self
.
btnCancel
.
setEnabled
(
True
)
self
.
thread
.
resume
(
)
def
__onClickedBtncancel
(
self
)
:
self
.
btnBegin
.
setEnabled
(
True
)
self
.
btnPause
.
setEnabled
(
False
)
self
.
btnResume
.
setEnabled
(
False
)
self
.
btnCancel
.
setEnabled
(
False
)
self
.
thread
.
cancel
(
)
if
__name__
==
"__main__"
:
app
=
QApplication
(
sys
.
argv
)
dialog
=
MyDialog
(
)
dialog
.
show
(
)
sys
.
exit
(
app
.
exec_
(
)
)
在上面的代码中,我们创建了一个名为My
Thread
的自定义线程类。在这个方法中,我们使用一个无限循环来模拟线程的执行。在循环内部,我们检查is_paused标志,如果为False,则执行线程任务的代码。在循环内部,我们检查is_paused标志,如果为False,则执行线程任务的代码。在上面的代码中,我们创建了一个QApplication实例和MainWindow实例,并将主窗口显示出来。在上面的代码中,我们创建了一个QApplication实例和MainWindow实例,并将主窗口显示出来。
Python如何安全地挂起、
恢复
、终止
Qthread
线程Python如何安全地挂起、
恢复
、终止
Qthread
线程为啥
thread
ing仅有start而没有end?
Python如何安全地挂起、
恢复
、终止
Qthread
线程
我是一个Python初学者,最近在用
PyQt
5做Gui的时候遇到一个烧脑的问题,如何安全的实现线程的
暂停
、终止。如果粗暴的kill掉线程,比如说线程正在requests一个数据,这样总感觉不太好,于是查阅了1晚上的各种资料(没有老师教,没地请教,只能自己动手~呜呜呜呜)。
为啥
thread
运用
Pyqt
5的QWaitCondition与QMutex类相结合,实现QThead线程的开始,
暂停
(挂起),
恢复
,结束,由理论知识开头让读者了解其原理,在用实例辅助说明。
尊重原创,请读原文
class start
Thread
(
QThread
): #继承
QThread
trigger =
pyqt
Signal() #创建信号
def __init__(self):
super(start
Thread
, self).__init__()
self.flag = 1 #自定义变量 ...
在这个示例中,我们创建了一个继承自
QThread
的 Worker
Thread
类,并在其中定义了一个 is_running 标志位,默认为 True。run() 方法是线程的执行函数,它在 while 循环中执行一些任务,并且在每次循环之间会
暂停
一秒钟。点击 "Stop
Thread
" 按钮时,会调用线程的 stop() 方法,将 is_running 设置为 False,从而终止线程的执行。在实际应用中,你可能需要在线程执行任务的地方定期检查标志位,以便在合适的时机终止线程的执行。
本文中,展示了使用实现多线程编程,实现了一个具有启动、
暂停
、
恢复
和终止功能的线程。本文虽然是一个简单的示例,但它也将多线程开发中该用到的知识点都用上了,算是抛砖引玉吧。希望本文能够帮助读者理解和应用 PySide6 的多线程功能。
QWaitCondition()用于多线程同步,一个线程调用QWaitCondition.wait()阻塞等待,
直到另外一个线程调用QWaitCondition.wake()唤醒才继续往下执行
QMutex():是锁对象
线程执行的时候需要先上锁,并在运行的时候,定义一个判断标志,如果该标志触发就执行线程的挂起,直到再次唤醒。
主程序启动一个.
需要注意的是,这里的底层实现源码仅仅是核心代码的简化并省略了很多细节,实际的底层实现涉及到了系统相关的调用和底层实现的细节。类的私有数据(private data)成员,存储了线程的 ID、运行状态和错误码等信息。方法底层实现源码涉及到一些跨平台的底层细节和系统调用,下面是一个简化版的源码分析。函数创建并启动底层线程,如果返回值不为 0,则设置错误码并退出。函数在超时时间内未能获取到信号量,则设置错误码并退出。,该信号量会在底层线程内部启动完成后释放锁定,这时。在完成了一些底层细节的操作之后,
PyQt
中的多线程
QThread
示例。传统的图形用户界面应用程序都只有一个执行线程,并且一次只执行一个操作。如果用户从用户界面中调用一个比较耗时的操作,那么当执行这个程序时,虽然实际上该操作正在进行,但用户界面通常会冻结而不再响应。为了解决这个问题,通常会让用户的UI界面运行在它自己的线程中,而另外的事件处理过程则发生在一个或多个其他线程中。这样做之后,即使在处理那些数据密集的事件时,应用程序也能对GUI用户界面保持响应。
在
PyQt
中,
QThread
是进行线程编程的核心类,它对底层的线程操作进行了封装,并为我们提供了诸多便捷的方法和信号槽机制。这使得我们能够轻松地在应用程序中实现多线程功能。为了使用
QThread
,我们需要创建一个子类来扩展其功能,并重写run()方法。在这个方法中,我们编写需要在新的线程中执行的代码。一旦创建了子类的实例,并调用start()方法,新线程便开始运行。