首页 > 其他分享 >PySide2-QThread创建、终止、暂停、继续、延时功能实现

PySide2-QThread创建、终止、暂停、继续、延时功能实现

时间:2024-04-08 11:33:50浏览次数:25  
标签:setEnabled pause False self stop PySide2 延时 btn QThread

程序实现了一个能够显示0-99数字循环进度的功能,并提供了进度查看、暂停、继续及终止操作。

import sys
import time

from PySide2.QtCore import (
    QObject,
    QThread,
    Qt,
    Signal,
    QTimer,
    QCoreApplication,
    QEventLoop,
    Slot,
)
from PySide2.QtWidgets import (
    QMainWindow,
    QWidget,
    QVBoxLayout,
    QTextEdit,
    QPushButton,
    QApplication,
)


class Worker(QThread):
    sn_progress = Signal(str)
    sn_paused = Signal()
    sn_resumed = Signal()

    def __init__(self, parent=None):
        super().__init__(parent)

        self.flag_stop = False  # 标志:是否停止任务
        self.flag_pause = False  # 标志:是否暂停任务

    def run(self):
        num = 100

        for i in range(num):
            if self.flag_stop:  # 检查是否需要停止任务的执行
                return

            if self.flag_pause:  # 检查是否需要暂停任务的执行
                self.sn_paused.emit()  # 发射暂停信号
                while self.flag_pause:  # 循环等待直到暂停状态解除
                    time.sleep(0.1)
                    if self.flag_stop:  # 如果需要停止任务,立即返回
                        return
                self.sn_resumed.emit()  # 发射恢复执行信号

            self.sn_progress.emit(str(i))  # 发射进度信息信号
            time.sleep(0.1)  # 延迟0.1秒

    def stop(self):
        self.flag_stop = True  # 设置停止标志

    def pause(self):
        self.flag_pause = True  # 设置暂停标志

    def resume(self):
        self.flag_pause = False  # 清除暂停标志


class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.setWindowTitle("主窗口")
        self.resize(300, 200)

        self.widget = QWidget()
        layout = QVBoxLayout()
        self.widget.setLayout(layout)
        self.setCentralWidget(self.widget)

        self.text_edit = QTextEdit(self)
        self.btn_start = QPushButton("开始")
        self.btn_stop = QPushButton("终止")
        self.btn_pause = QPushButton("暂停")
        self.btn_resume = QPushButton("继续")

        self.btn_stop.setEnabled(False)
        self.btn_pause.setEnabled(False)
        self.btn_resume.setEnabled(False)

        layout.addWidget(self.text_edit)
        layout.addWidget(self.btn_start)
        layout.addWidget(self.btn_stop)
        layout.addWidget(self.btn_pause)
        layout.addWidget(self.btn_resume)

        # 工作线程对象
        self.worker = None

        # 终止标记。终止后线程也会触发finished信号,导致界面出现结束日志
        self.flag_stop = False

        # 事件
        self.btn_start.clicked.connect(self.start)  # 开始
        self.btn_stop.clicked.connect(self.stop)  # 终止
        self.btn_pause.clicked.connect(self.pause)  # 暂停
        self.btn_resume.clicked.connect(self.resume)  # 继续

    @Slot()
    def start(self):
        self.worker = Worker()  # 创建工作线程
        self.worker.sn_progress.connect(self.handle_sn_progress)  # 处理进度
        self.worker.sn_paused.connect(self.handle_sn_paused)  # 处理暂停
        self.worker.sn_resumed.connect(self.handle_sn_resumed)  # 处理继续
        self.worker.finished.connect(self.handle_sn_finished)  # 处理结束
        self.worker.start()  # 启动工作线程

        self.flag_stop = False

        self.btn_start.setEnabled(False)
        self.btn_stop.setEnabled(True)
        self.btn_pause.setEnabled(True)
        self.btn_resume.setEnabled(False)
        self.text_edit.clear()

    @Slot()
    def stop(self):
        self.worker.stop()  # 调用工作线程的终止执行方法
        self.flag_stop = True
        self.text_edit.append("终止")

        self.btn_start.setEnabled(True)
        self.btn_stop.setEnabled(False)
        self.btn_pause.setEnabled(False)
        self.btn_resume.setEnabled(False)

    @Slot()
    def pause(self):
        self.worker.pause()  # 调用工作线程的暂停执行方法

        self.btn_pause.setEnabled(False)
        self.btn_resume.setEnabled(True)

    @Slot()
    def resume(self):
        self.worker.resume()  # 调用工作线程的恢复执行方法

        self.btn_pause.setEnabled(True)
        self.btn_resume.setEnabled(False)

    @Slot()
    def handle_sn_progress(self, msg):
        self.text_edit.append(msg)

    @Slot()
    def handle_sn_paused(self):
        self.text_edit.append("暂停")

    @Slot()
    def handle_sn_resumed(self):
        self.text_edit.append("继续")

    @Slot()
    def handle_sn_finished(self):
        if not self.flag_stop:
            self.text_edit.append("结束")

        self.btn_start.setEnabled(True)
        self.btn_stop.setEnabled(False)
        self.btn_pause.setEnabled(False)
        self.btn_resume.setEnabled(False)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    main_window = MainWindow()
    main_window.show()
    sys.exit(app.exec_())

标签:setEnabled,pause,False,self,stop,PySide2,延时,btn,QThread
From: https://blog.csdn.net/2402_84143950/article/details/137482246

相关文章

  • 闲来无事-esp32cam实现延时摄影
    扯淡时间在上一篇文章中我提了一嘴,打算使用esp32cam实现一个延迟摄影,奈何存在各种硬件问题,商家发了好几个地板都不好使(就是那个拼多多商家的问题,还说我供电不稳,我特意买了独立供电的hub),后来逛淘宝的时候又给我推送了esp32的板子,我不信邪的买了一个~他妈的上来就好使,所以才有了......
  • C++实现windows高精度微秒级延时(亲测可用)
    C++实现windows高精度微秒级延时(亲测可用)代码如下:#include<iostream>#include<windows.h>//定义一个结构体来保存性能计数器的频率和时间戳structPerformanceCounter{LARGE_INTEGERfrequency;//计数器频率LARGE_INTEGERstart;//开始时间......
  • 关于EF延时加载的面试题
    publicasyncTask<ActionResult>GetData(){vardata=(fromleftdatainGetLeft()joinrightdatainGetRight()onleftdata.Idequalsrightdata.Idintotempdatafrommatchdataintempdata.DefaultIfE......
  • Qt 线程池 QThreadPool
    一.Qt线程池QThreadPool介绍Qt线程池是一种管理多个线程的并发编程模型,通过使用线程池可以提高性能、控制并发度、提供任务队列和简化线程管理。在Qt中,线程池的使用主要涉及以下几个步骤:创建任务类:需要定义一个任务类,该类继承自QRunnable和QObject,以便于能够在线程中运行......
  • 使用定时器中断进行延时,可能会遇到的一个小bug
    之前分享过一篇“使用定时器中断进行延时,取代delay”的文章:(https://blog.csdn.net/qq_44139306/article/details/136481381?spm=1001.2014.3001.5501)在后续的使用过程中,发现了一个bug:即:定时器标志不要在刚使用完一次时就清零,可以在下一次赋值计数值前把它清零。特别是......
  • 关于hal库 延时函数HAL_Delay()
    __weakvoidHAL_Delay(uint32_tDelay){uint32_ttickstart=HAL_GetTick();uint32_twait=Delay;/*Addafreqtoguaranteeminimumwait*/if(wait<HAL_MAX_DELAY){wait+=(uint32_t)(uwTickFreq);//理解在最下方向}w......
  • MATLAB----遗传算法及Simulink延时模块实例
    clctic%%参数初始化maxgen=100;%进化代数,即迭代次数,初始预定值选为100sizepop=200;%种群规模,初始预定值选为100pcross=0.9;%交叉概率选择,0和1之间,一般取0.9pmutation=0.01;%变异概率选择,0和1之间,一般取0.01individuals=struct('fitness',zeros(1,sizepop),'chrom',[]);%种群......
  • C++ Qt开发:运用QThread多线程组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QThread组件实现多线程功能。多线程技术在程序开发中尤为常用,Qt框架中提供了QThread库来......
  • 软件延时循环次数经验,内循环和外循环
    在C语言中,内循环和外循环是指嵌套循环中的两个不同级别的循环。通常情况下,我们希望尽量保持外循环次数少,因为外循环的执行次数通常决定了整体算法的复杂度。如果外循环的次数过多,程序的执行效率可能会受到影响。voiddelayMs(uintxms) //@12.000MHz{ xms=xms/10; while(......
  • RedissonRedLock写一个加锁方式,实现自动延时、程序停止就停止延时
    要使用Redisson的RedLock实现加锁,并实现自动延时以及在程序停止时停止延时,你可以按照以下示例代码进行操作:importorg.redisson.Redisson;importorg.redisson.api.RLock;importorg.redisson.api.RedissonClient;importorg.redisson.config.Config;importjava.util.con......