Python 如何将窗口关闭(红色x)链接到函数以关闭PyQt中的所有线程?

Python 如何将窗口关闭(红色x)链接到函数以关闭PyQt中的所有线程?,python,multithreading,qt,qt4,pyqt,Python,Multithreading,Qt,Qt4,Pyqt,目前我正在开发一个用PyQt开发的GUI应用程序 此GUI的功能包含多个线程。我想这就是当我简单地点击窗口角落的红色x时的原因 尽管GUI的视觉方面正在消失,但它并没有完全关闭该进程 是否有一种方法可以将主窗口中的x链接到停止所有线程的关闭函数 我是PyQt的新手,所以对我放松点!另外,我相信我的所有线程都是Python线程,而不是Qthreads您可以在启动线程之前将Thread对象上的标志设置为True。如合同所述: 线程可以标记为“守护线程”。这一点的意义 标志是当只有守护进程线程时,整个

目前我正在开发一个用PyQt开发的GUI应用程序

此GUI的功能包含多个线程。我想这就是当我简单地点击窗口角落的红色x时的原因

尽管GUI的视觉方面正在消失,但它并没有完全关闭该进程

是否有一种方法可以将主窗口中的x链接到停止所有线程的关闭函数

我是PyQt的新手,所以对我放松点!另外,我相信我的所有线程都是Python线程,而不是Qthreads

您可以在启动线程之前将Thread对象上的标志设置为True。如合同所述:

线程可以标记为“守护线程”。这一点的意义 标志是当只有守护进程线程时,整个Python程序退出 剩下的就剩下了。初始值从创建线程继承。这个 可以通过daemon属性设置标志

还值得注意的是,这是潜在的危险,这取决于您的后台线程再次执行的操作,引用以下内容:

守护进程线程在关闭时突然停止。他们的资源包括 由于打开的文件、数据库事务等可能无法发布 正确地如果你想让你的线程优雅地停下来,就让它们停下来 非daemonic,并使用适当的信令机制,如

实现优雅关机的方式在某种程度上取决于线程代码的实现方式,但它看起来是这样的:

线程方法:

def threaded_method(event, ...):
    while True:
       if event.is_set()
           # clean up
           return
       # Normal stuff it does goes here.
主线程:

def on_exit(): # called when X in main window pressed
    event.set() # Tell threads to cleanup.
    # Do normal exit stuff.

if __name__ == "__main__":
    event = threading.Event()
    t = threading.Thread(target=threaded_method, args=(event, ...))
    #t.daemon = True # Assuming you don't care about gracefully stopping the threads, you can just do this and leave out the Event stuff.
    t.start()
    # other stuff

请注意,如果线程中的循环阻塞了某些东西,例如从程序退出时未解除阻塞的子进程获取数据,则这种方法可能不起作用。如果是这样的话,请告诉我,我可能会修改我的答案以涵盖这一点。

这个问题没有解决方案,无法完全终止正在进行的无休止的流程。启动流程的人通常负责停止流程。因此,如果你是唯一一个你知道如何阻止他们。如果QT启动了一些进程并正确使用,它将停止所有进程,您无需担心。如果没有任何代码,您的问题的这一部分无法得到一般回答。问题的核心部分归结为如何截取结束事件并开始手动清理,您必须自己进行清理或显示一些代码。在我看来,相关问题很好地回答了核心部分。