отдельные потоки в приложении 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.Если вы уже запускаете это внутри основного цикла, то я бы предположил, что вы делаете что-то не то.Я могу подробнее рассказать о ваших вариантах, если вы предоставите нам немного больше деталей и / или полный пример.
В-третьих, и это всплыло только позже:Всегда , всегда всегда всегда убедитесь, что вы позвонили gtk.gdk.threads_init
в любом приложении pygtk с потоками.GTK + имеет разные пути к коду при выполнении threaded, и он должен знать, чтобы использовать их.
Я написал небольшая статья о pygtk и потоках это предлагает вам небольшую абстракцию, так что вам никогда не придется беспокоиться об этих вещах.Этот пост также содержит пример индикатора выполнения.