【问题标题】:How to link the window close (red x) to a function to close all threads in PyQt? [duplicate]如何将窗口关闭(红色 x)链接到关闭 PyQt 中所有线程的函数? [复制]
【发布时间】:2014-06-30 14:24:16
【问题描述】:

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

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

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

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

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

【问题讨论】:

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

标签: python multithreading qt qt4 pyqt


【解决方案1】:

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

可以将线程标记为“守护线程”。这件事的意义 flag 是当只有守护线程时整个 Python 程序退出 留下了。初始值继承自创建线程。这 可以通过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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 2012-04-01
    • 1970-01-01
    相关资源
    最近更新 更多