1

我正在尝试使用 wxPy 构建一个 GUI 应用程序来执行一些长脚本操作。我已将 GUI 和脚本放在不同的线程中以防止阻塞。这工作得很好,除了在我关闭 GUI 之后,包含脚本的线程仍然在运行。

下面是我的程序的简化版本(对不起,如果代码难以理解或缺少部分,我在缩短程序方面很糟糕)

class Form(wx.Frame):
    ...
    def test(self, evt):
        t2 = threading.Thread(target = self.runTest)
        t2.start()
    def runTest(self):
       result = really_long_script()

def main():
   app = wx.App(False)
   form = form(app)
   app.MainLoop()

t1 = threading.Thread(target = main)
t1.start()

有什么办法可以杀死线程吗?现在,当我关闭窗口时,脚本仍在后台运行。

任何帮助将不胜感激!

谢谢,

约翰

4

2 回答 2

3

如果将线程设置为守护线程,它将与主线程一起死亡。

您可以通过t2.daemon = True在调用 start 之前添加该行来执行此操作

编辑:检查这个例子,t.daemon = True当你关闭框架时线程死了,如果你注释掉那t.daemon = True行,框架关闭后线程保持活动状态

import wx
import time
from threading import Thread

def print_something_forever(something):
    while True:
        print something
        time.sleep(1)

class Frame(wx.Frame):
    def __init__(self,parent):
        wx.Frame.__init__(self,parent)
        self.panel= wx.Panel(self)
        t= Thread(target=print_something_forever,args=("Thread alive!",))
        t.daemon= True
        t.start()
        self.Show()

if __name__ == "__main__":
    app= wx.App(False)
    Frame(None)
    app.MainLoop()
于 2012-09-13T11:31:06.683 回答
1

Python 不支持杀死/销毁线程,可能是因为内存泄漏、资源丢失等。

试试这个“线程化类”:D

class Run_Other_Thread(threading.Thread):
      "Raises a child thread \
       I'm busy dying, rather lying - _P0W !"
      def __init__(self,func_name,*args): #Constructor
            self._func=func_name
            self._func_args=args
            threading.Thread.__init__(self)
      def run(self): # Start Dying
            try:
                print("\n** Running New Thread :"+self._func.func_name)
            except:
                print("\n** Running New Thread :"+self._func.__name__)
            self._func(*self._func_args)
      def stop(self):
            print('!! Stopped')
      def __del__(self):#Constructor
            try:
                print('\n  @@ Farewell :'+self._func.func_name)
            except:
                print('\n  @@ Farewell :'+self._func.__name__)

您可以将 GUI 运行为:(并尝试关闭)

def GUI():
    app= wx.App(False)
    Frame(None)
    app.MainLoop()

if __name__ == '__main__':
      "Tkinter GUI in Thread helps in De-bugging"
      Run_Other_Thread(GUI).start() # Release command window control
于 2012-09-16T16:10:52.793 回答