4

pyGTK アプリケーションのスレッド化に問題があります。スレッドがタスクを完了するまでしばらく待ちます。問題がある場合は続行しますが、ユーザーに警告します。ただし、続行すると、このスレッドは gtk.main_quit が呼び出されるまで停止します。これは私を混乱させます。

関連するコード:

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
4

1 に答える 1

9

まず、 をサブクラス化せずthreading.Thread、 を使用しますThread(target=callable).start()

第二に、おそらく明らかなブロックの原因は、デフォルトで に設定されてgtk.main_iterationいるパラメータを受け取ることです。そのため、反復するイベントがない場合、への呼び出しは実際にブロックされます。これは次の方法で解決できます。blockTruegtk.main_iteration

gtk.main_iteration(block=False)

ただし、実際の gtk メイン ループではなく、このハッキングされたループを使用する理由については、実際の説明はありません。メイン ループ内で既にこれを実行している場合は、間違ったことをしていると思います。もう少し詳細や完全な例を提供していただければ、オプションを拡張できます。

第三に、これは後で出てきました。常にスレッドを使用してpygtkアプリケーションを呼び出したことを常に確認してください GTK+ は、スレッド化された実行時にさまざまなコード パスを持ち、これらを使用するために知る必要があります。gtk.gdk.threads_init

私はpygtk とスレッドに関する小さな記事を書きました。この記事では、これらのことを心配する必要がないように、小さな抽象化を提供します。その投稿には、進行状況バーの例も含まれています。

于 2009-03-26T14:31:59.863 に答える