Это в вилке Phoenix wxPython.wxPython thread blocking
Я пытаюсь запустить пару потоков в интересах не блокирования графического интерфейса.
Два моих потока работают нормально, но другой, похоже, не попадает в связанную с ним функцию результата. Я могу сказать, что он работает, он просто не кажется должным образом размещать событие.
Вот функция результата для основных вычислительных потоков:
def on_status_result(self, event):
if not self.panel.progress_bar.GetRange():
self.panel.progress_bar.SetRange(event.data.parcel_count)
self.panel.progress_bar.SetValue(event.data.current_parcel)
self.panel.status_label.SetLabel(event.data.message)
Вот как я их связывания:
from wx.lib.pubsub.core import Publisher
PUB = Publisher()
Вот как я связывание метода:
def post_event(message, data):
wx.CallAfter(lambda *a: Publisher().sendMessage(message, data=data))
И вот нити. Первые из них не работает, а вторые два сделать:
class PrepareThread(threading.Thread):
def __init__(self, notify_window):
threading.Thread.__init__(self)
self._notify_window = notify_window
self._want_abort = False
def run(self):
while not self._want_abort:
for status in prepare_collection(DATABASE, self._previous_id, self._current_id, self._year, self._col_type,
self._lock):
post_event('prepare.running', status)
post_event('prepare.complete', None)
return None
def abort(self):
self._want_abort = True
class SetupThread(threading.Thread):
def __init__(self, notify_window):
threading.Thread.__init__(self)
self._notify_window = notify_window
self._want_abort = False
def run(self):
while not self._want_abort:
do_more_stuff_with_the_database()
return None
def abort(self):
self._want_abort = True
class LatestCollectionsThread(threading.Thread):
def __init__(self, notify_window):
threading.Thread.__init__(self)
self._notify_window = notify_window
self._want_abort = False
def run(self):
while not self._want_abort:
do_stuff_with_my_database()
return None
def abort(self):
self._want_abort = True
prepare_collection
это функция, которая дает Status
объектов, выглядит следующим образом:
class Status:
def __init__(self, parcel_count, current_parcel, total, message):
self.parcel_count = parcel_count
self.current_parcel = current_parcel
self.total = total
self.message = message
Вот как я создаю/запуск/подписок PrepareThread:
MainForm(wx.Form):
prepare_thread = PrepareThread(self)
prepare_thread.start()
self.pub = Publisher()
self.pub.subscribe(self.on_status_result, 'prepare.running')
self.pub.subscribe(self.on_status_result, 'prepare.complete')
def on_status_result(self, event):
if not self.panel.progress_bar.GetRange():
self.panel.progress_bar.SetRange(event.data.parcel_count)
self.panel.progress_bar.SetValue(event.data.current_parcel)
self.panel.status_label.SetLabel(event.data.message)
Я попытался гася prepare_collection
с range(10)
, но я до сих пор никогда не попал накануне nt обработчик.
эй morgan извините ... у меня, вероятно, не будет шанса сегодня вечером пересмотреть это ... просто супер занято:/ –
@joran Все хорошо. –
oh dang ... извините ... я попробую и помогу вам в этот уик-энд его просто сумасшедшая неделя –