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

时间:2014-06-30 14:24:16

标签: python multithreading qt qt4 pyqt

目前我正在开发一个在PyQt.

中开发的GUI应用程序

此GUI的功能包含多个线程。我认为这就是我只需点击窗口一角的红色x的原因。

它没有完全关闭过程(尽管GUI的视觉方面消失了)。

有没有办法可以将主窗口中的x链接到一个停止所有线程的关闭函数?

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

1 个答案:

答案 0 :(得分:0)

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

  

线程可以标记为“守护程序线程”。这个的意义   flag是只有守护进程线程时整个Python程序退出   离开了。初始值继承自创建线程。该   flag可以通过daemon属性设置。

值得注意的是,这有潜在危险,具体取决于您的后台线程正在做什么(再次引用documentation):

  

守护程序线程在关闭时突然停止。他们的资源(如此   作为打开文件,数据库事务等)可能不会被释放   正常。如果你想让你的线程优雅地停止,那就制作它们吧   非守护进程并使用合适的信令机制,例如Event

实现正常关闭的方式在某种程度上取决于线程代码的实现方式,但它看起来像这样:

线程方法:

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

请注意,如果您的程序退出时线程中的循环阻塞某些内容(例如从子进程获取数据),则此方法可能无法正常工作。如果是这种情况,请告诉我,我可以修改我的答案来解决这个问题。