Questo è nel fork Phoenix di wxPython.blocco thread wxPython
Sto provando a eseguire un paio di thread nell'interesse di non bloccare la GUI.
Due dei miei thread funzionano bene, ma l'altro non sembra mai raggiungere la sua funzione di risultato associata. Posso dire che è in esecuzione, non sembra pubblicare correttamente l'evento.
Ecco la funzione di risultato per i fili conduttori di calcolo:
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)
Ecco come io li sto vincolante:
from wx.lib.pubsub.core import Publisher
PUB = Publisher()
Ecco come sto vincolante il metodo:
def post_event(message, data):
wx.CallAfter(lambda *a: Publisher().sendMessage(message, data=data))
E qui ci sono i fili. Il primo non funziona, ma le altre due fanno:
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
è una funzione che produce Status
oggetti che assomiglia a questo:
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
ecco come sto creando/inizio/sottoscrizione il 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)
ho provato spegnendo prepare_collection
con range(10)
, ma io ancora non mai colpito alla vigilia gestore di NT.
hey morgan mi dispiace ... probabilmente non avrò la possibilità di rivedere questa recensione ... appena super impegnata:/ –
@joran Va tutto bene. –
oh dang ... mi dispiace ... mi proverò provare e aiutare il tuo questo weekend è stata solo una settimana pazzesca –