gpt4 book ai didi

python - PySide:QThread 事件处理

转载 作者:太空宇宙 更新时间:2023-11-03 18:49:21 25 4
gpt4 key购买 nike

我一直在研究有关 PySide 线程的以下问题,但我发现的文档很少,因此这里有一篇关于我的发现的长篇文章,希望能得到一些关于其进展情况的简洁反馈。假设我们正在构建一个调用某些 Linux 进程的多线程 GUI 应用程序。我们将使用 QThread 类从内部调用 QProcess,目的是让应用程序在准备就绪时同时运行多个进程(在不同的线程中)

我只使用 QThread 类并从 QApplication 主循环开始

情况1:- 我们将线程终止信号连接到调用 self.exit 的同一类的另一个函数(以便线程类退出)- 按照 PySide 官方文档 http://tinyurl.com/qh7cooa 中的指示,没有调用 self.exec_()

#!/usr/bin/python3.2
from PySide import QtGui
from PySide import QtCore
import sys, random

class ProcThread(QtCore.QThread):

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

def run(self):
try:
self.qproc = QtCore.QProcess()
self.finished.connect(self.threadFinished)
filename = "/home/user1/Desktop/fileno"+str(random.randint(1, 10000))+".txt"
self.qproc.start("touch", [filename])
except Exception as error:
print(str(error))
raise(error)

#self.exec_()

def threadFinished(self):
print("Thread has finished")
self.qproc.close()

app = QtGui.QApplication(sys.argv)
procthread = ProcThread()
procthread.start()
app.exec_()

结果:捕获线程终止(打印消息“线程已完成”),进程确实运行(创建文件),但应用程序不退出

情况2:与之前相同,但现在也调用self._exec() (取消前面代码片段中相关行的注释)结果:线程终止未被捕获,进程确实运行(文件被创建),并且在 Ctrl+Z 之后应用程序再次不退出(仍然作为后台作业)/必须显式终止它

情况3:现在连接QProcess时发出的信号通过 self.qproc.finished.connect(self.threadFinished) 终止。没有调用 self.exec_()

仅在 try- except - #self.exec_() 之间引用代码仍保留注释
self.qproc = QtCore.QProcess()
self.qproc.finished.connect(self.threadFinished)
filename = "/home/pantelis/Desktop/fileno" + str(random.randint(1, 10000)) + ".txt"
self.qproc.start("touch", [filename])

结果:与情况 2 一样 - 未捕获线程终止,进程确实运行(创建文件),并且应用程序再次不退出

情况 4:与情况 1 相同,但现在在 threadFinished 中添加以下行 self.exit()结果:与情况 2 一样 - 线程终止未被捕获,进程确实运行(文件被创建),并且应用程序再次不退出

案例 5:与案例 4 一样,只需取消注释 self.exec_()结果:线程终止(打印消息“线程已完成”),文件创建,应用程序再次不退出

案例 6、7、8:已添加 self.qproc.close() / self.qproc.terminate() / self.qproc.kill()threadFinished从特定函数显式终止 QProcess结果:如案例 5

还可以尝试不同的替代方案,例如链接 self.terminated QThread的信号至threadFinished等等。一些非常粗糙的问题,尽管我认为这是一个复杂的问题:- 为什么尽管正式文档指出调用 QThreadexec_()函数对于线程启动事件处理是必需的,这似乎是在没有调用特定函数的情况下发生的- 在某些情况下,线程终止被 threadFinished 捕获/处理。在某些情况下并非如此- 最重要的是:为什么应用程序不终止? (我也尝试过app = QtCore.QCoreApplication(sys.argv))

最佳答案

只需在 threadFinished 处理程序中调用 app.quit() 即可,如果您有可见的小部件,则 hide() destroy() 主窗口,这应该负责销毁所有子窗口。

关于python - PySide:QThread 事件处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18723384/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com