《博主简介》
小伙伴们好,我是阿旭。专注于人工智能AI、python、计算机视觉相关分享研究。
✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~
感谢小伙伴们点赞、关注!
《------往期经典推荐------》
一、AI应用软件开发实战专栏【链接】
项目名称 | 项目名称 |
---|---|
1.【人脸识别与管理系统开发】 | 2.【车牌识别与自动收费管理系统开发】 |
3.【手势识别系统开发】 | 4.【人脸面部活体检测系统开发】 |
5.【图片风格快速迁移软件开发】 | 6.【人脸表表情识别系统】 |
7.【YOLOv8多目标识别与自动标注软件开发】 |
二、机器学习实战专栏【链接】,已更新31期,欢迎关注,持续更新中~~
三、深度学习【Pytorch】专栏【链接】
《------正文------》
QThread 是 Qt 提供的一个用于多线程编程的类,而 Python 中可以使用 QThread 通过 PyQt 或 PySide2 模块进行调用。在多线程编程中,有时候我们需要在某些情况下终止线程的执行,比如保存一个耗时比较长的文件,中途执行取消保存的操作,就需要终止线程。本文将介绍一种在 Python 中终止 QThread 线程的方案。
假设我们有一个多线程的应用程序,其中一个线程负责进行一些耗时的计算操作,并在计算完成后通过信号通知主线程。现在有一个需求,我们希望当用户点击一个按钮时,能够立即中止正在进行的计算操作。如何实现这个需求呢?我们可以使用以下方案。
我们首先需要创建一个继承自 QThread 的子类,用于执行我们的耗时操作。以下是一个示例:
from PyQt5.QtCore import QThread, pyqtSignal
class WorkerThread(QThread):
finished = pyqtSignal() # 用于发射任务执行完毕的信号
def __init__(self):
super().__init__()
self.is_running = True # 标志位,表示线程是否正在运行
def run(self):
while self.is_running:
# 执行耗时操作
self.do_work()
self.finished.emit()
def stop(self):
self.is_running = False
def do_work(self):
# 执行耗时操作的函数
pass
在上述代码中,我们创建了一个名为 WorkerThread 的子类,继承自 QThread 类。在 WorkerThread 类中,我们定义了一个 finished 信号,用于通知主线程任务执行完毕。同时,我们还添加了一个 is_running
标志位,表示线程是否正在运行。
在 run() 方法中,我们通过一个 while 循环来执行耗时操作。当 is_running
为 True
时,继续执行循环体内的操作;当 is_running
为 False
时,终止循环并发射 finished 信号。
在主线程中,我们需要创建一个 WorkerThread 的实例,并调用 start() 方法来启动线程。以下是一个示例:
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton
from PyQt5.QtCore import Qt
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.thread = WorkerThread()
self.thread.finished.connect(self.on_finished)
self.button = QPushButton("Stop", self)
self.button.clicked.connect(self.on_button_clicked)
self.setCentralWidget(self.button)
def on_button_clicked(self):
# 结束线程
self.thread.stop()
def on_finished(self):
self.button.setEnabled(False)
if __name__ == "__main__":
app = QApplication([])
window = MainWindow()
window.show()
app.exec_()
在上述代码中,我们创建了一个名为 MainWindow 的类,继承自 QMainWindow。在 MainWindow 类的构造函数中,我们创建了一个 WorkerThread 的实例,并将它与 finished 信号关联。同时,我们还创建了一个按钮,点击按钮时会调用 on_button_clicked
方法。
在 on_button_clicked
方法中,我们调用了 stop() 方法来停止子线程的执行。
在 on_finished
方法中,我们禁用了按钮,防止用户重复点击。
当用户点击按钮时,会触发 on_button_clicked
方法,从而调用 stop() 方法停止子线程的执行。在 stop() 方法中,我们将 is_running
标志位设置为 False
,从而中止子线程的执行。
参考:https://blog.51cto.com/u_16175515/7225554
如果文章对你有帮助,欢迎✌关注、点赞、✌收藏、订阅专栏!
欢迎关注下方GZH:阿旭算法与机器学习,共同学习交流~