2016-06-30 14 views
0

サブスレッドが既に実行されているかどうかをチェックする関数を作成したいと思います。サブスレッドは、関数とパラメータを指定してサブスレッドを開始します。マルチスレッド・ツールとして、私はこのポストを使用します。Is there any way to kill a Thread in Python?サブスレッドをパラメータを含む任意の関数で開始する

アイデアは、これまでに以下の通りです:私が実行している場合

from ThreadEx import ThreadEx 

class MyClass: 
    def __init__(self): 
     self.__Thread = ThreadEx(name='MyClass',target="") 
     self.GlobalVariable = "MyClass Variable" 

    def SubThread(self, function): 
     if not self.__Thread.is_alive(): 
      print("Thread is not alive") 
      self.__Thread = ThreadEx(target=function(),args=(self,)) 
      print("Thread is going to start") 
      self.__Thread.start() 
      print("Thread started") 
     else: 
      print("There is already a subthread running") 

    def MyFunction1(self, argument1, argument2, argument3): 
     self.SubThread(lambda: MyFunction1(self, argument1,argument2,argument3)) 

    def MyFunction2(self, argument1, argument2): 
     self.SubThread(lambda: MyFunction2,argument1,argument2) 


def MyFunction1(self, argument1, argument2, argument3): 
    print(self.GlobalVariable) 
    print("MyFunction1") 
    print("Argument1: " + str(argument1)) 
    print("Argument2: " + str(argument2)) 
    print("Argument3: " + str(argument3)) 

def MyFunction2(argument1, argument2): 
    print("MyFunction2") 
    print("Argument1: " + str(argument1)) 
    print("Argument2: " + str(argument2)) 

は、残念ながら:

from Myclass import MyClass 

self.MyClass = MyClass() 
self.MyClass.MyFunction1("Test1","Test2","Test3") 

を出力は、次のとおりです。

Thread is not alive 
MyClass Variable 
MyFunction1 
Argument1: Test1 
Argument2: Test2 
Argument3: Test3 
Thread is going to start 
Thread started 

したがって、関数はスレッドが開始する前に実行されます。だから私の質問は、どのようにサブスレッドにすべての引数を含むMyFunctionを送信し、毎回ルーチンを書くことなく他の関数でこれを繰り返すことができるかどうかです。 私はすでに* argsと** kwargsを探していましたが、正しい構文が見つからないか、間違った方法でした。

ありがとうございます! :)

答えて

0

あなたの問題は、この行です:

self.__Thread = ThreadEx(target=function(),args=(self,)) 

お知らせ機能の後ろに括弧。これは、機能がターゲットに割り当てられていないことを意味しますが、の結果はとなります。そのため、関数は実行され、印刷などはになり、の出力(None)はtargetに割り当てられ、スレッドが開始されます。

代わりにこれを行います。これらのラムダへ

self.__Thread = ThreadEx(target=function,args=(self,)) 

より一般的な選択肢は、あなたが言及として、*args**kwargsを使用することです。それは次のようになります。

class MyClass: 
    # ... other class code goes here 
    def SubThread(self, function, *args, **kwargs): # changed 
    if not self.__Thread.is_alive(): 
     print("Thread is not alive") 
     self.__Thread = ThreadEx(target=function,args=args, kwargs=kwargs) # changed 
     print("Thread is going to start") 
     self.__Thread.start() 
     print("Thread started") 
    else: 
     print("There is already a subthread running") 

    def MyFunction1(self, argument1, argument2, argument3): 
    self.SubThread(MyFunction1, self, argument1, argument2, argument3) # changed, note explicit inclusion of self 

# ... function code goes here 

my_instance = MyClass() 
my_instance.MyFunction1("Test1","Test2","Test3") 
my_instance.SubThread(MyFunction1, my_instance, "Test1", "Test2", "Test3") # note explicit inclusion of my_instance 
+0

は 自己.__スレッド= ThreadEx(対象=機能、引数の=(自己)) がうまくいかなかったに変更しますが、一般的な選択肢は非常によく問題を解決します!ありがとう! – Marc

関連する問題