如何在应用程序退出时正确终止线程

时间:2017-02-21 10:44:42

标签: python .net multithreading winforms python.net

我正在使用pythonnet制作简单的gui。

import os, sys, ntpath, threading
from subprocess import call

import clr
clr.AddReference("System")
clr.AddReference("System.Windows.Forms")


import System
import System.Windows.Forms as WinForms
from System.Threading import ApartmentState, Thread, ThreadStart
from System.Windows.Forms import (Application, Form, Button)
from System.Drawing import Point

class demo(WinForms.Form):
    def __init__(self):
        self.filename = None
        self.InitializeComponent()

    def InitializeComponent(self):
        """Initialize form components."""
        self.components = System.ComponentModel.Container()
        self.btn = Button()
        self.btn.Parent = self
        self.btn.Click += self.process
        self.CenterToScreen()
        self.cmd = "Running forever command"

    def Dispose(self):
        self.components.Dispose()
        WinForms.Form.Dispose(self)

    def thread_process(self):
        call(self.cmd, shell=True)
        pass

    def process(self, sender, args):
        self.thread = threading.Thread(target=self.thread_process, daemon=True)
        self.thread.start()

    def OnClickFileExit(self, sender, args):
        self.Close()

WinForms.Application.Run(demo())

它工作正常但是当我点击退出按钮时,显然应用程序没有停止。如何在用户关闭应用程序时正确停止正在运行的线程?

1 个答案:

答案 0 :(得分:2)

如果符合您的需要,您可能需要尝试将process主题设置为deamon主题:

self.thread = threading.Thread(target=self.thread_process, daemon=True)

以下是关于deamon主题的一些信息:

  

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

     

来源:https://docs.python.org/2/library/threading.html#thread-objects