线程的终止问题一直是可比较头疼的问题,今天找到了一个比较好的例子,分享给大家

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import ctypesfrom PyQt5.QtCore import QThread, pyqtSignal
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QProgressBar, QPushButton
import win32con
from win32process import SuspendThread, ResumeThreadclass Worker(QThread):valueChanged = pyqtSignal(int)  # 值变化信号handle = -1def run(self):try:# 这个目前我没弄明白这里写法 self.handle = ctypes.windll.kernel32.OpenThread(  # @UndefinedVariablewin32con.PROCESS_ALL_ACCESS, False, int(QThread.currentThreadId()))except Exception as e:print('get thread handle failed', e)print('thread id', int(QThread.currentThreadId()))# 循环发送信号for i in range(1, 101):print('value', i)self.valueChanged.emit(i)QThread.sleep(1)class Window(QWidget):def __init__(self, *args, **kwargs):super(Window, self).__init__(*args, **kwargs)# 垂直布局layout = QVBoxLayout(self)self.progressBar = QProgressBar(self)self.progressBar.setRange(0, 100)layout.addWidget(self.progressBar)self.startButton = QPushButton('开启线程', self, clicked=self.onStart)layout.addWidget(self.startButton)self.suspendButton = QPushButton('挂起线程', self, clicked=self.onSuspendThread, enabled=False)layout.addWidget(self.suspendButton)self.resumeButton = QPushButton('恢复线程', self, clicked=self.onResumeThread, enabled=False)layout.addWidget(self.resumeButton)self.stopButton = QPushButton('终止线程', self, clicked=self.onStopThread, enabled=False)layout.addWidget(self.stopButton)# 当前线程idprint('main id', int(QThread.currentThreadId()))# 子线程self._thread = Worker(self)self._thread.finished.connect(self._thread.deleteLater)self._thread.valueChanged.connect(self.progressBar.setValue)def onStart(self):print('main id', int(QThread.currentThreadId()))self._thread.start()  # 启动线程self.startButton.setEnabled(False)self.suspendButton.setEnabled(True)self.stopButton.setEnabled(True)def onSuspendThread(self):if self._thread.handle == -1:return print('handle is wrong')ret = SuspendThread(self._thread.handle)print('挂起线程', self._thread.handle, ret)self.suspendButton.setEnabled(False)self.resumeButton.setEnabled(True)def onResumeThread(self):if self._thread.handle == -1:return print('handle is wrong')ret = ResumeThread(self._thread.handle)print('恢复线程', self._thread.handle, ret)self.suspendButton.setEnabled(True)self.resumeButton.setEnabled(False)def onStopThread(self):self.startButton.setEnabled(False)self.suspendButton.setEnabled(False)self.resumeButton.setEnabled(False)ret = ctypes.windll.kernel32.TerminateThread(  # @UndefinedVariableself._thread.handle, 0)print('终止线程', self._thread.handle, ret)self.stopButton.setEnabled(False)def closeEvent(self, event):if self._thread.isRunning():self._thread.quit()# 强制# self._thread.terminate()del self._threadsuper(Window, self).closeEvent(event)if __name__ == '__main__':import sysimport osprint('pid', os.getpid())from PyQt5.QtWidgets import QApplicationapp = QApplication(sys.argv)w = Window()w.show()sys.exit(app.exec_())

PyQt5中线程挂起终止和唤醒相关推荐

  1. java线程挂起唤醒_JAVA并发(10)—interrupt唤醒挂起线程

    1.1 中断方法 在独占锁加锁过程中,我们看到,线程进入sync queue中后便调用park()方法将自己挂起.等待其他线程调用unpark()方法唤醒自己.那么当我们调用interrupt()方法 ...

  2. Java并发编程(3):线程挂起、恢复与终止的正确方法(含代码)

    挂起和恢复线程 Thread 的API中包含两个被淘汰的方法,它们用于临时挂起和重启某个线程,这些方法已经被淘汰,因为它们是不安全的,不稳定的.如果在不合适的时候挂起线程(比如,锁定共享资源时),此时 ...

  3. linux中线程的挂起与恢复(进程暂停)

    今 天 在网上查了一下 linux中对进程的挂起与恢复的实现,相关资料少的可怜,大部分都是粘贴复制.也没有完整详细的代码.故自己整理了一下 程序流程为:主线程创建子线程(当前子线程状态为stop停止状 ...

  4. java线程挂起唤醒_java线程技术6_线程的挂起和唤醒[转]

    转自:http://blog.chinaunix.net/uid-122937-id-215913.html 1. 线程的挂起和唤醒 挂起实际上是让线程进入"非可执行"状态下,在这 ...

  5. 安装ubuntu出现花屏_在Ubuntu 18.04系统中挂起,再唤醒就出现花屏的解决办法

    如果你在Ubuntu 18.04系统中按电源键挂起,然后唤醒后就出现花屏现象,请用下面介绍的办法操作,经实测,可以解决花屏问题.所使用的系统版本及设备如下图: 背景 安装Ubuntu 18.04系统后 ...

  6. java构造函数中启动线程_java-为什么不在构造函数中启动线程? 如何终止?

    java-为什么不在构造函数中启动线程? 如何终止? 我正在学习如何在Java中使用线程. 我写了一个实现Runnable的类,以同时运行到另一个线程. 主线程处理侦听串行端口,而第二个线程将处理向同 ...

  7. c语言中的线程管理,深入解析C++编程中线程池的使用

    为什么需要线程池目前的大多数网络服务器,包括Web服务器.Email服务器以及数据库服务器等都具有一个共同点,就是单位时间内必须处理数目巨大的连接请求,但处理时间却相对较短. 传 统多线程方案中我们采 ...

  8. Linux中线程和进程的区别

    Linux中线程和进程的区别 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,它是系统进行资源分配和调度的一个独立单位.例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括 ...

  9. 一文弄懂Java中线程池原理

    在工作中,我们经常使用线程池,但是你真的了解线程池的原理吗?同时,线程池工作原理和底层实现原理也是面试经常问的考题,所以,今天我们一起聊聊线程池的原理吧. 为什么要用线程池 使用线程池主要有以下三个原 ...

最新文章

  1. 怎么往integer型数组添加数据_用户日活月活怎么统计 - Redis HyperLogLog 详解
  2. python实现键盘记录器
  3. OI/ACM 刷题网站 人气OJ简介
  4. 更新json文件_忽略packagelock.json?
  5. 课后作业-阅读任务-阅读笔记3
  6. 建立 arm-linux 交叉编译环境
  7. Dreamweaver网页设计与制作100例:用DIV+CSS技术设计的书法主题网站(web前端网页制作课作业)...
  8. 《初级会计电算化实用教程(金蝶KIS专业版)》一1.5 课后习题
  9. PLECS的热模型无法导入的解决办法
  10. oracle database link
  11. React修改图片大小
  12. 小写字母转大写字母并输出ASCLL值
  13. 21个令程序员泪流满面的瞬间 ...
  14. 大专毕业,从6个月开发转入测试岗位的一些感悟——写在测试岗位3年之际
  15. 小程序、APP、企业网站开发工具有哪些?如何使用软件开发工具?
  16. win10安装SQL Server 2017 遇到的一大堆问题(+SSMS)【最后用虚拟机解决】
  17. POS机IC卡参数、公钥下载流程及POSP数据库设计
  18. hive执行报错:Both left and right aliases encountered in JOIN
  19. 计算机网络基础昆明理工大学,昆明理工大学 计算机网络基础 实验三
  20. wolframalpha最新版_wolfram alpha 安卓版下载

热门文章

  1. 阿里云验证SSL证书
  2. int 为何是4字节,为什么是4字节呢?
  3. 题目名称:一个萝卜一个坑
  4. java jpanel 半透明_java – 透明JPanel
  5. 干货来了!2019阿里云合作伙伴峰会SaaS加速专场回顾合集:嘉宾分享、深度解读...
  6. Mendeley 使用技巧
  7. caffe(cpu)配置之终极成功版哈哈哈
  8. git错误 ! [rejected] master -> master (non-fast-forward)
  9. 《仰望》——保罗 詹尼斯
  10. 三种方法求字符串长度