PyGTKをアプリケーション内の別のスレッド
-
22-08-2019 - |
質問
私は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
解決
まず、サブクラスではないthreading.Thread
を行い、Thread(target=callable).start()
を使用します。
第二に、そしておそらくあなたの見かけ上のブロックの原因はそれgtk.main_iteration
があるので、あなたの呼び出しは、上の反復するイベントがないときに実際にブロックしますblock
し、デフォルトはTrue
するパラメータgtk.main_iteration
を取ります。どちらで解決することができます:
gtk.main_iteration(block=False)
しかし、あなたは実際のgtkのメインループではなく、これまでのハッキングループを使用する理由は実際の説明はありません。あなたは既にメインループ内でこれを実行している場合は、その後、私はあなたが間違ったことをやっていることを示唆しています。あなたは私たちにもう少し詳細および/または完全な例を与える場合、私はあなたのオプションに展開することができます。
第三に、これが唯一の後に思い付いた:常に常に<全角>常にのの の常にのを使用すると、スレッドを持つすべてのPyGTKのアプリケーションでgtk.gdk.threads_init
と呼ばれていることを確認してください。スレッド化の実行時にGTK +は、異なるコードパスを持っており、それはこれらを使用することを知っている必要があります。
私は PyGTKをとスレッドに関する小さな記事を書いたそれは、あなたがこれらの事を心配する必要はありませんので、小さな抽象化を提供しています。その記事はまた、プログレスバーの例が含まれます。