PySide:QThread事件处理

2024-06-28 15:30:14 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

案例1: -我们将线程终止信号连接到调用的同一类的另一个函数自行退出(以便thread类退出) -不打电话给self.exec公司_()如PySide http://tinyurl.com/qh7cooa官方文件中所述

#!/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_()

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

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

情况3:现在连接QProcess通过self.qproc.finished.connect(self.threadFinished)终止时发出的信号。 不打电话给self.exec公司_()

只引用try之间的代码,除非-#self.exec公司_()仍有评论 ^{pr2}$

结果:与案例2一样,没有捕捉到线程终止,进程确实在运行(创建文件),应用程序再次不退出

案例4:与案例1一样,但是现在在threadFinished中添加以下行 self.exit()当应用程序不再运行时,应用程序将不再运行

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

案例6、7、8:在threadFinished中添加self.qproc.close() / self.qproc.terminate() / self.qproc.kill(),以从特定函数显式终止QProcess 结果:与案例5相同

人们也可以尝试不同的选择,例如将QThreadself.terminated信号链接到{}等等。 一些非常粗糙的问题,虽然我猜是一个复杂的问题: -为什么尽管正式文档声明调用QThreadexec_()函数是线程启动事件处理所必需的,但这似乎是在没有调用特定函数的情况下发生的 -在某些情况下,线程终止由threadFinished捕获/处理,而在某些情况下则不是 -最重要的是:为什么应用程序不终止?(我也试过app = QtCore.QCoreApplication(sys.argv)


Tags: 文件函数self应用程序进程线程案例exec