【发布时间】:2015-12-04 16:26:54
【问题描述】:
这是在 wxPython 的 Phoenix 分支中。
为了不阻塞 GUI,我正在尝试运行几个线程。
我的两个线程工作正常,但另一个似乎从未达到其绑定的结果函数。我可以说它正在运行,只是似乎没有正确发布事件。
这是主计算线程的结果函数:
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)
我尝试使用range(10) 将prepare_collection 存根,但我仍然没有点击事件处理程序。
【问题讨论】:
-
嘿,摩根,对不起……我今晚可能没有机会回顾这个……只是超级忙:/
-
@joran 一切都好。
-
哦,天哪......对不起......我会尽力帮助你这个周末这真是一个疯狂的一周
-
@JoranBeasley 没问题。
-
顺便说一句 - 我猜你是here?某些代码看起来就是您正在尝试调整的内容 - 对吗?
标签: python multithreading wxpython