2017-08-08 8 views
0

Pythonのプログラミングでは、私が呼び出すときに関数や何かを実行するとコードが進行しないようにするのが一般的です。だから私はブロックを解除する最善の方法はスレッドを使用していると思うが、もし私が何をすべきかスレッドを停止する必要がありますか? 私はthis referenceを試してみましたが、私はこの簡単なプログラムを書いた:Pythonのkill関数を持つ非ブロックのスレッド

import threading 
from time import sleep 
class my_thread(threading.Thread): 
    """Thread class with a stop() method. The thread itself has to check 
    regularly for the stopped() condition.""" 

    def __init__(self): 
     super(my_thread, self).__init__() 
     self._stop_event = threading.Event() 

    def stop(self): 
     print("stopping the thread") 
     self._stop_event.set() 

    def stopped(self): 
     value=self._stop_event.is_set() 
     print("value of stop event is",value) 
     return value 
    def run(self): 
     print("running the thread") 
     print("start function startt()") 
     self.startt() 

    def startt(self): 
     print("it is going to wait forever") 
     while True: 
      #wait forever 
      pass 
     print("This line never execute") 


def main(): 
    for i in range(0,3): 
     print("it is the main function") 
     sleep(1) 


if __name__+'__main__': 
    thr=my_thread() 
    thr.start() 

    sleep(5) 
    thr.stop() 
    thr.stopped() 
    print("calling the main function") 
    main() 
    print("Exiting the whole program") 

私の問題は、このプログラムは、実際にスレッドを停止するが、プログラムがまだ実行され、最後の行を印刷した後です。私が望むのは、私が停止機能を呼び出すと、それはスレッドを起動して#wait forever lineを実行し、停止機能を呼び出すとthr.stop()はクラス全体を停止し、#wait forever lineからmain関数に戻ります。

EDIT-- 私はそれを修正することができますが、私はこのコードの代わりに、while Trueあったら私の問題は、例えば、一般的である@a_guest答えとして:

pythoncom.PumpMessages() 

(または他のコード)

を何私はする必要がありますか?

+0

あなたがしたいことは、 'while true'の代わりにあなたのイベントをチェックすることです。あなたが応答停止を望むならば、3'rdパーティブロッキングコールを使用することはできません。 'something.isthereanythingtodo()の代わりにsomething.do()else loop'のようなAPIをブロックする – user3012759

答えて

1

代わり

while True: 
    ... 

のあなたは

while not self.stopped(): 
    ... 

が、それはあなたstop()スレッド一度whileループから抜け出すだろう使用する必要があります。

+0

答えてくれてありがとうございます。しかし、' pythoncom.PumpMessages() 'のようなブロックではどうしたらいいですか? –

+0

私は 'pythoncom'に慣れていませんが、例題[' Queue.get'](https://docs.python.org/3/library/queue.html#queue.Queue.get)に 'タイムアウト'パラメータを設定することができます。これは永遠に(*' timeout'秒で)*ブロッキングされません。 'pythoncom.PumpMessages()'にはおそらく同様のものがあります。手動で回避する必要がある場合は、別の質問の価値があります。 –

+0

いいえ、タイムアウトを設定したくない場合は、必要なときに関連する関数を呼び出すと直ちにブロック行を終了することです。 –

1

実行中のスレッドを停止することはできません。停止するかどうかを定期的に確認するメカニズムをスレッド自体に持つ必要があります。

通常のスレッドは、残りのプログラム(プロセス)が終了している間は実行され続けます。 しかし、スレッドを「デーモン」スレッドにすると、プログラムが終了すると自動的に強制終了されます。これを行うには、スレッドのinitメソッドにself.daemon=Trueと設定します。 More info https://docs.python.org/3/library/threading.html#threading.Thread.daemon

+0

ありがとう、しかし、私はデーモンを使用する場合、プログラム全体を終了すると仮定します。私のmain()関数では、私はしばらくあります。 –

+0

あなたの質問が分かりません。もちろん、何かを走っているか待っている何か*を持っていなければなりませんか?実行するものがない場合、プログラムは明らかに停止します。 –

+0

@IrmendeJong私は、メインスレッドから特定のスレッド(ブロッキング呼び出しでスタックされている)を終了させる方法について質問しました。 –

関連する問題