QThread

使用PyQt5开发应用程序时,处理耗时较长的任务时为避免主程序卡死就要用到QThread开子线程,有时子线程是去执行For/While 循环任务,我们如果想临时终止线程,就可以增加一个属性用作判定是否要临时终止的标志位,每轮循环开始前做一次校验判定是否要退出。

示例

以下示例是做LED循环开关及调光测试的小程序,循环次数通常都设置在数万次,运行后如发现DUT表现异常操作员就要终止测试。

代码

主程序代码(片段)

 self.ui.dimmer_cycle_exec.clicked.connect(self.dimmer_cycle)self.ui.dimmer_cycle_terminate.clicked.connect(self.cycle_stop)##Cycledef dimmer_cycle(self):self.cycle = cyclingCtrl()self.cycle.setTerminationEnabled()self.cycle.dimer_targets = self.ui.dimer_targets.text()self.cycle.dimmer_hold_time = self.ui.dimmer_hold_time.text()self.cycle.dimmer_cycle_times = self.ui.dimmer_cycle_times.text()self.cycle.port = self.ui.cycle_ser_port.currentText()self.cycle.dimmer_cycle_exec_is_clicked = Trueself.cycle.flare.connect(self.sinShow)if self.ser:self.cycle.ser = self.serself.cycle.start()def cycle_stop(self):# 点击”终止“按钮后将子线程 stop_flag属性置1,终止循环self.cycle.stop_flag = 1self.ui.textBrowser.append("\t循环终止!")

子线程代码

# -*- coding:utf-8 -*-
from PyQt5.QtCore import *
import serial
import time
import datetime
import logging
from math import ceilclass CyclingCtrl(QThread):"""Cycling control devices to test the performace."""flare = pyqtSignal(str)def __init__(self):super(CyclingCtrl, self).__init__()self.dimer_targets = Noneself.dimmer_hold_time = Noneself.dimmer_cycle_times = Noneself.dimmer_cycle_exec_is_clicked = Falseself.led_onoff_cycle_targets = Noneself.led_onoff_transtime = Noneself.led_onoff_cycle_times = Noneself.led_onoff_cycle_exec_is_clicked = Falseself.turn_onoff_cycle_targets = Noneself.turn_onoff_hold_time = Noneself.turn_onoff_cycle_times = Noneself.turn_onoff_cycle_exec_is_clicked = Falseself.ser = Noneself.port = Noneself.CycleCtrl_log_file = Noneself.stop_flag = 0  # 线程终止信号,主线程通过修改子线程的该属性控制线程终止def run(self):if self.ser is None:self.ser = serial.Serial(port=self.port, baudrate=115200, timeout=3)elif self.ser.is_open:self.flare.emit("%s 连接成功" % self.port)else:self.flare.emit("%s 连接失败" % self.port)if self.dimmer_cycle_exec_is_clicked:self.flare.emit("开始执行LED dimmer Cycling 程序")self.led_dimmer_cycling()elif self.led_onoff_cycle_exec_is_clicked:self.flare.emit("开始执行LED OnOff Cycling 程序")self.led_onoff_cycling()elif self.turn_onoff_cycle_exec_is_clicked:self.flare.emit("开始执行Turn OnOff Cycling 程序")self.turn_onoff_cycling()else:self.flare.emit("循环控制指令发送失败")def led_dimmer_cycling(self):logDate = datetime.datetime.now().strftime("%Y%m%d_%Hh_%Mm_%Ss")self.CycleCtrl_log_file = "./logs/log%s_dimmerCycling_logs.log" % logDatelogging.basicConfig(filename=self.CycleCtrl_log_file, level=logging.INFO, format="%(asctime)s :\n%(message)s")for cycle in range(0, int(self.dimmer_cycle_times)+1):for i in range(0, 21):if self.stop_flag:break   # 用户点击 “Stop" 时主线程将self.stop_flag置1,子线程循环终止if i < 11:# move level up from 0% to 100%self.ser.write(("\r\n" + "zcl level-control o-mv-to-level {0} 0\r\n".format(ceil(i * 25.5)) + "send {} 1 1\r\n".format(self.dimer_targets)).encode('utf-8'))self.flare.emit("%s\tCycle-%d: o-mv-to-levle=%d percent" % (datetime.datetime.now().strftime("%Y%m%d_%Hh_%Mm_%Ss"), cycle, i*10))logging.info("%s\tCycle-%d: o-mv-to-levle=%d percent" % (datetime.datetime.now().strftime("%Y%m%d_%Hh_%Mm_%Ss"), cycle, i*10))time.sleep(int(self.dimmer_hold_time))else:# move level down from 90% to 0%self.ser.write(("\r\n" + "zcl level-control o-mv-to-level {0} 0\r\n".format(ceil(510-ceil(i * 25.5))) + "send {} 1 1\r\n".format(self.dimer_targets)).encode('utf-8'))self.flare.emit("%s\tCycle-%d:o-mv-to-level=%d percent" % (datetime.datetime.now().strftime("%Y%m%d_%Hh_%Mm_%Ss"), cycle, (20-i)*10))logging.info("%s\tCycle-%d:o-mv-to-level=%d percent" % (datetime.datetime.now().strftime("%Y%m%d_%Hh_%Mm_%Ss"), cycle, (20-i)*10))time.sleep(int(self.dimmer_hold_time))def cycling_pause(self):# TODO:暂停线程self.flare.emit("Dimmer循环暂停!")passdef cycling_continue(self):# TODO: 线程继续执行pass

TODO

线程挂起、继续还没找到比较靠谱的实现方法。

QThread 线程终止相关推荐

  1. APUE学习笔记-11.5线程终止

    2019独角兽企业重金招聘Python工程师标准>>> <312>获得线程退出状态 #include "myapue.h" #include < ...

  2. Java多线程(九)—— interrupt()和线程终止方式

    一.interrupt() 说明 interrupt()的作用是中断本线程. 本线程中断自己是被允许的:其它线程调用本线程的interrupt()方法时,会通过checkAccess()检查权限.这有 ...

  3. PyQt5之QThread线程模块

    PyQt5之QThread线程模块 版权声明:版权没有,转载随意 https://blog.csdn.net/MAOZEXIJR/article/details/80983337 一.QThread ...

  4. 重点:怎样正确的使用QThread类(注:包括推荐使用QThread线程的新方法QObject::moveToThread)...

    背景描述: 以前,继承 QThread 重新实现 run() 函数是使用 QThread唯一推荐的使用方法.这是相当直观和易于使用的.但是在工作线程中使用槽机制和Qt事件循环时,一些用户使用错了.Qt ...

  5. 5、线程终止方式:pthread_cleanup_push/pthread_cleanup_pop()

    以下内容根据[1]进行整理.关于取消点,将在后面进一步讨论. 1.一般来说,Posix的线程终止有两种情况:正常终止和非正常终止.线程主动调用pthread_exit()或者从线程函数中return都 ...

  6. APUE2勘误-11.5节 线程终止(关于线程清理处理程序)

    平台:Linux 2.6.28-19-generic 书中讲解所用的linux版本为Linux 2.4.22,我没有在此版本上做实验的机会,只是在当前用的版本上做了测试,问题原因可能是Linux内核版 ...

  7. Posix线程编程指南(4) 线程终止

    线程终止方式 一般来说,Posix的线程终止有两种情况:正常终止和非正常终止.线程主动调用pthread_exit()或者从线程函数中return都将使线程正常退出,这是可预见的退出方式:非正常终止是 ...

  8. python 串行线程终止后还会执行下一个吗_多线程笔记

    1.线程的状态 狂神说多线程讲解 休眠方法: public static void sleep(long millis) 放弃方法:放弃对时间片的使用 public static void yield ...

  9. 【转】线程、Thread类和线程终止

    一.线程Thread启动 0. Thread类实现了java.lang.Runnable接口,即实现了run方法.虽然在Sun JDK中,start()调用了start0()方法,start0()方法 ...

  10. [Linux]线程概念_线程控制(线程与进程的区别与联系 | 线程创建 | 线程等待 | 线程终止 | 线程分离 | LWP)

    文章目录 线程概念 进程和线程的关系 线程的优点 线程的缺点 线程控制 Linux线程和接口关系的认识 线程创建 线程ID及进程地址空间布局 线程等待 线程终止 线程终止状态 线程分离 LWP和pth ...

最新文章

  1. git commit之后,想撤销commit
  2. Android实例-为程序创建快捷方式(未测试)
  3. 十二个 ASP.NET Core 例子
  4. 爬山算法和模拟退火算法简介(转)
  5. Java 算法 数字黑洞
  6. linux下各种后缀名文件的压缩和解压缩
  7. mysql sql trace_SQL_TRACE及 Tkprof用法以及问题分析
  8. 相关滤波的视觉目标跟踪算法学习
  9. STM32控制舵机及其原理
  10. 整理PC端微信文件夹
  11. 云计算时代:哪些企业适合上云?
  12. 太湖之光超级计算机应用最高奖,世界最快超级计算机“神威·太湖之光”获得100多项应用成果...
  13. ff14 掉线 服务器维护,《FF14》29日更新维护 暂不推出手工补丁
  14. 使用Arcgis画等值线图
  15. 【RTSP/RTP流媒体】10、编写简单的RTSP客户端
  16. 瑞芯微RK3568对比RK3399性能解析
  17. 类的封装(概念,如何封装)
  18. win10_3D画图软件文字粘贴时的BUG解决
  19. 这是一个用notepad++和masm5.0搭建的汇编环境
  20. Idea报错source 1.6 中不支持 diamond 运算符 (请使用 -source 7 或更高版本以启用 diamond 运算符)

热门文章

  1. 计算机版的微信的功能是什么,计算机上的微信有没有收藏功能?电脑端如何打开微信收藏?...
  2. TVS瞬态抑制二极管选型指南
  3. 华为快应用 阻止事件冒泡
  4. mysql 同比sql_mysql计算同比和环比的区别_【面试真题】Mysql实现计算同比、环比...
  5. 车牌识别的matlab程序(程序_讲解_模板),车牌识别的matlab程序(程序-讲解-模板)资料...
  6. 华为网络设备-NAT实验
  7. 如何在线制作二维码?学校通知二维码的3种制作方法
  8. Vue学习之vue-cli脚手架下载安装及配置
  9. 中国紧急警报系统(EAS)行业发展现状与前景动态预测报告2022-2027
  10. Error:java: 无效的源发行版: 8