添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

问题描述:

在主窗口初始化过程中开启新线程socket,socket线程中又开启子线程与客户端socket通信,关闭主窗口时总是不能退出所有线程(客户端是单独开启一个子进程)。

解决方案:

搜了一下网上的,主要是设置守护进程、重写关闭函数等:

设置守护进程:setDaemon(True),这个方法有效果,语句要写在线程start之前:

self.your_thread = threading.Thread(target=self.fun, args=(arg1, arg2))
# 设置线程为守护线程,防止退出主线程时,子线程仍在运行
self.your_thread.setDaemon(True)
# 新线程启动,注意要先设置守护线程再启动
self.your_thread.start()

重写关闭函数:closeEvent(self, event),这个方法也可行,在函数内用os._exit(0)退出,尝试了sys.exit(0)、sys.exit(app.exec_())代替os._exit(0),发现不可行:

def closeEvent(self, event):
对MainWindow的函数closeEvent进行重构
退出软件时结束所有进程
    reply = QtWidgets.QMessageBox.question(self,'提示',"确认退出吗?",QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No,QtWidgets.QMessageBox.No)
    if reply == QtWidgets.QMessageBox.Yes:
        event.accept()
        #用过sys.exit(0)和sys.exit(app.exec_()),但没起效果
        os._exit(0)
    else:
        event.ignore()

具体原因还没分析,后续可以深入了解一下。

问题描述:在主窗口初始化过程中开启新线程socket,socket线程中又开启子线程与客户端socket通信,关闭主窗口时总是不能退出所有线程(客户端是单独开启一个子进程)。解决方案:搜了一下网上的,主要是设置守护进程、重写关闭函数等:设置守护进程:setDaemon(True),这个方法有效果,语句要写在线程start之前:self.your_thread = threading.Thread(target=self.fun, args=(arg1, arg2))# 设置线程为守护
pyqt5 设计了一个主窗体,在窗体运行时需要把一个无限循环放在一个 线程 去工作。运行后,发现通过鼠标按主窗体的 关闭 按键 关闭 主创体后, 线程 不会自动终止,依然在运行。尽管对我的使用场景来说,这不是问题,因为立马就关机了。但在调试阶段就恨繁,因为后台 线程 很占资源。怎么能让主窗体 关闭 是子 线程 退出 呢?百度了许久,很多方法都不行。 主要试过的有: 1、设置:self. thread .Daemon=True 2、在子 线程 设置一个变量,通过改变变量的值使循环不满足条件,自动 结束 3、设置析构函数 还有别的奇葩。都不行。 今天发现,其实很简单。就是重构主窗体的closeEvent()函数。 def close
QtCore.Q Thread 休眠启动中断 2020/8/2 ================================================================================= 实例1:休眠启动 #!/usr/bin/env python # -*- coding: utf-8 -*- from PyQt5 .QtCore import Q Thread , QWaitCondition, QM.
from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(327, 303) self.centralwidget = QtWidgets.QWidget(M
PyQt5 -子 窗口 关闭 时,强制 关闭 线程 目的:为解决 在多 窗口 调用过程中,由于在子 窗口 中启用了 线程 处理任务,当 关闭 窗口 后, 线程 没有 关闭 的问题。 参考 pyqt 使用手册: 调用terminate()这个方法可强制 关闭 当前 线程 具体代码如下: import Q Thread # 重新 线程 ,在run()函数中以打印数字模拟耗时任务 class My Thread (Q Thread ): def __init__(self): super().__init__() def run(s
前面在 pyqt5 多线程 (Q Thread )遇到的坑(一)中提到了先实例化类,再把实例对象传参到 线程 类,这样的确实可行,但是还是遇到了新坑。 pyqt5 多线程 (Q Thread )遇到的坑(一 被实例化的类是做数据处理的,传入和导出的的数据比较大,最少都是几万行的excel表格数据(pandas.DataFrame),而且传入的数据最少两个pandas.DataFrame表,多的时候会传入7个,而且有一些数据是公共数据,每次处理都必须处理的,直接放在数据处理类的初始化__init__中了,而这部分数据处理也是稍微有的耗时,那么坑就来了,先实例化数据处理类,那么这部分稍微耗时的数据处理也会导
尊重原创,请读原文 class start Thread (Q Thread ): #继承Q Thread trigger = pyqt Signal() #创建信号 def __init__(self): super(start Thread , self).__init__() self.flag = 1 #自定义变量 ...
在程序设计中,为了不影响主程序的执行,常常把耗时操作放到一个单独的 线程 中执行。Qt对 多线程 操作有着完整的支持,Qt中通过继承Q Thread 并重写run()方法的方式实现 多线程 代码的编写。针对 线程 之间的同步与互斥问题,Qt还提供了QMutex、QReadWriteLock、QwaitCondition、QSemaphore等多个类来实现。 本篇博客将针对以下几个方面进行讲解 [1]Q Thread ...
文章目录文章目录第8章 多线程 线程 的生命周期 线程 的同步同步代码块处理实现Runnable的 线程 安全问题同步代码块处理继承 Thread 类的 线程 安全问题同步方法处理实现Runnable的 线程 安全问题同步方法处理继承 Thread 类的 线程 安全问题 线程 安全的单例模式之懒汉式死锁的问题Lock锁方式解决 线程 安全问题 线程 的通信sleep()和wait()的异同经典例题:生产者/消费者问题JDK5.0新增 线程 创建方式创建 多线程 的方式三:实现Callable接口使用 线程 池的好处创建 多线程 的方式四:使用 线程 池 self.your_ thread = thread ing. Thread (target=self.tcp_client_concurrency) # 设置 线程 为守护 线程 ,防止 退出 线程 时,子 线程 仍在运行 self.your_threa...
抱歉,我是一名语言模型,无法提供基于 PyQt5 多线程 电子钟。但是,我可以提供一些基本的概念和步骤,帮助你开始编写这样的程序。 PyQt5 是一个用于创建图形用户界面(GUI)的 Python 库。 多线程 是一种并发编程技术,可以让程序同时执行多个任务。 要创建一个基于 PyQt5 多线程 电子钟,你可以按照以下步骤进行操作: 1. 导入所需的 PyQt5 多线程 模块: ``` python import sys from PyQt5 .QtWidgets import QApplication, QMainWindow, QLabel from PyQt5 .QtCore import Q Thread , QTimer, pyqt Signal 2. 创建一个继承自Q Thread 线程 类: ``` python class Clock Thread (Q Thread ): time_updated = pyqt Signal(str) def run(self): while True: current_time = QDateTime.currentDateTime().toString('hh:mm:ss') self.time_updated.emit(current_time) self.sleep(1) 这个 线程 类包含一个run()方法,用于执行实际的 线程 任务。在这个例子中,我们使用QDateTime.currentDateTime()获取当前时间,并通过 pyqt Signal发送给主 线程 。 3. 创建一个继承自QMainWindow的主 窗口 类,用于显示时间: ``` python class ClockWindow(QMainWindow): def __init__(self): super().__init__() self.label = QLabel(self) self.label.setGeometry(50, 50, 200, 50) self.clock_ thread = Clock Thread () self.clock_ thread .time_updated.connect(self.update_time) self.clock_ thread .start() def update_time(self, time): self.label.setText(time) 在这个例子中,我们创建了一个QLabel用于显示时间,并在构造函数中创建了一个Clock Thread 对象。我们还连接了time_updated信号和update_time槽函数,以便在接收到新时间时更新标签。 4. 创建一个QApplication对象,并启动主 窗口 : ``` python if __name__ == '__main__': app = QApplication(sys.argv) window = ClockWindow() window.show() sys.exit(app.exec_()) 这个例子中,我们启动了一个QApplication对象,并将ClockWindow作为主 窗口 显示。最后,我们通过sys.exit() 退出 应用程序。 这是一个简单的例子,你可以根据自己的需求进行扩展和修改。例如,你可以添加按钮或菜单项来控制 线程 的启动和停止,或者使用QTimer来定时更新时间。
宁静致远LiHuaming: 要用thread.quit()或者QThread.terminate()(强制退出),然后thread.wait(), dell thread就可以了 [code=python] self.thread = QThread() ...... def closeEvent(self, event): self.thread.quit() self.thread.wait() sys.exit() [/code] pycharm中os.environ不能读取环境变量:raise KeyError(key) from None 请问增加哪个环境变量 plotjuggler安装 zmx_2019: 太感谢了,查了很多教程都没有这篇凝练实用 表情包