2012-02-02 55 views
0

対私は現在、ボタンがこれをトリガしているは、マルチスレッドはマルチプロセッシング

class workingthread(threading.Thread): 

    def __init__(self): 
     threading.Thread.__init__(self) 

     def run(self): 
       while 1: 
         chat = skype.CreateChatWith(name) 
         chat.SendMessage(message) 
         time.sleep(timeou) 

が、私はこれを切り替えることが持ってしようとしているが、私は聞いたことがある方法はありませんスレッドを止めるために、私は本当にマルチプロセッシングを使いたくありません。他の方法は、私はwx GUIを遅らせることなくこれを動作させることができますか?

+0

__init __()で書式設定エラーが発生しているか、実際にはrun()が実際に定義されていますか? – jdi

+0

フォーマットエラーです。私はその笑をするつもりはなかった。 – user1152873

答えて

2

あなたはこれを試してみることができます。これは自分で行いました。

from Queue import Queue 
import threading 

class workingthread(threading.Thread): 

    def __init__(self): 
     threading.Thread.__init__(self) 
     self._queue = Queue() 

    def run(self): 
     while True: 

      item = self._queue.get(block=True) 
      if item is None: 
       return 

      name, message = item 
      chat = skype.CreateChatWith(name) 
      chat.SendMessage(message) 

    def processOne(self, data): 
     self._queue.put_nowait(data) 

    def stop(self): 
     self._queue.put(None) 

これは明らかな例ですが、スレッド内でブロックするキューを作成します。あなたはいつでもスレッドを起動し、実行します。それはあなたがそれを引き起こすか停止するのを待つ。

+0

これ以上説明できますか? – user1152873

+0

何が起こるかは、スレッドがループしている間にスレッドが開始して同じループに入ることですが、常に永遠に回転するのではなく、キューをチェックしています。キューはスレッドにとって安全であり、何もない場合はブロックすることができる、ファンシーリストのようなものです。すぐにself._queue.get()にそこに座って、アイテムを待っています。あなたのメインプログラムから、あなたのデータでprocessOne()を呼び出すことによって何かを行うように通知することができます。それはキューに置かれ、スレッドはブロックを解除して処理し、ループして再び待機します。 stop()を呼び出すと、キューにNoneが格納されます。 – jdi

+0

ここに必要なデータは何ですか?processOne(self、data): self._queue.put_nowait(data) – user1152873

3

"while 1"ではなく、 "true"で始まる変数に置き換えて、 "false"(スレッドを終了するように通知する)に変更することをおすすめします。

これはもちろん、あなたが引き続きループしていることを前提としています(「チャット。*」メソッドでブロックされていない、または「スリープ()」で待機中)。

+0

正確です。子スレッドを自分自身で止めることはできませんが、それらを通知することができ、終了して自分で停止することができます。 –

+0

それを試してみてください。 – user1152873

+0

まだその笑をしようとしています。 – user1152873

関連する問題