2017-02-21 140 views
1

我正在使用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()) 

它工作正常,但當我單擊退出按鈕時,顯然應用程序不會停止。如何在用戶關閉應用程序時正確停止正在運行的線程?

+0

這是IronPython的或pythonnet? – denfromufa

回答

2

你可能想嘗試設置你的process線程作爲deamon線程,如果它適合你的需要:

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

這裏的守護進程線程的一些信息:

一個線程可以標記爲「守護線程」。這個 標誌的意義在於,只有守護程序線程 剩下時,整個Python程序纔會退出。初始值是從創建線程繼承的。 標誌可以通過守護進程屬性設置。

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

+0

已經做到了。我認爲問題是啓動另一個非守護進程的subprocess.call。 – Rahul

+0

解決。但是,當產生的程序是另一個python線程時,問題就開始了。所以它混合起來。 – Rahul