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 に答える