2009-03-26 9 views
4

pyGTKアプリケーションをスレッドする際に問題が発生しています。私はスレッドにタスクを完了するための時間を与えます。問題がある場合は、とにかく続行しますが、ユーザーに警告します。しかし、一度続ければ、このスレッドはgtk.main_quitが呼び出されるまで停止します。これは私を混乱させる。pygtkアプリケーション内のスレッドを分割する

関連コード:

class MTP_Connection(threading.Thread): 
    def __init__(self, HOME_DIR, username): 
     self.filename = HOME_DIR + "mtp-dump_" + username 
     threading.Thread.__init__(self) 

    def run(self): 
     #test run 
     for i in range(1, 10): 
      time.sleep(1) 
      print i 

..........................

start_time = time.time() 
conn = MTP_Connection(self.HOME_DIR, self.username) 
conn.start() 
progress_bar = ProgressBar(self.tree.get_widget("progressbar"), 
          update_speed=100, pulse_mode=True) 
while conn.isAlive(): 
    while gtk.events_pending(): 
     gtk.main_iteration() 
    if time.time() - start_time > 5: 
     self.write_info("problems closing connection.") 
     break 
#after this the program continues normally, but my conn thread stops 
+0

私はあなたの痛みを感じます。私は自分の前にpygtkでスレッドゲームをしてきました! –

答えて

8

まず、サブクラスをthreading.Threadにしないでください。Thread(target=callable).start()を使用してください。

は第二に、そしておそらくあなたの見かけ上のブロックの原因はgtk.main_iterationがオンに反復するイベントがないときにgtk.main_iterationへのお電話は、実際にブロックする、パラメータblockTrueにデフォルト値をとるということです。どちらで解決することができます。

gtk.main_iteration(block=False) 

しかし、あなたはこのアップハッキングループではなく、実際のgtkのメインループを使用する理由は実際の説明はありません。すでにメインループ内でこれを実行している場合は、間違ったことをしていることをお勧めします。もう少し詳細や完全な例を与えれば、私はあなたの選択肢を広げることができます。第三に

、これが唯一の後に思い付いた:常に常に常に常にはあなたがスレッドを持つすべてのPyGTKのアプリケーションでgtk.gdk.threads_initと呼ばれていることを確認してください。 GTK +にはスレッドを実行するときに異なるコードパスがあり、これらを使用するには知っておく必要があります。

私はa small article about pygtk and threadsを書いています。これは小さな抽象を提供するので、これらのことを心配する必要はありません。そのポストにはプログレスバーの例も含まれています。

+2

あなたのページから、私が書かなければならないことがわかりました: gtk.gdk.threads_init()私は決してしませんでした。それは今働く。 私はスレッディングをサブクラス化してはならない理由は何ですか?私が見たすべての例はこれを行います。 – wodemoneke

+0

私はmainloopで動作していますが、スレッドが失敗するかどうかを知るまで続行したくないので、この内部ループを書きました。 – wodemoneke

+0

サブクラス化する必要はありません。 http://stackoverflow.com/questions/660961/overriding-python-threading-thread-run/660974#660974 –

関連する問題