无法 运行 后台线程和同时加载 wx GUI
Unable to run background thread and loading wx GUI at the same time
总结一下我的问题,我想加载我的程序主布局,但同时 运行 一个后台守护进程来检查数据库中的任务并通知用户。我正在使用 wx.CallAfter 在线程中执行守护程序,但是在加载程序时,GUI 冻结,直到线程处理所有通知然后加载 == 它不会 运行 在后台。
基本上我尝试的是:
- 运行 线程中的脚本
- 运行 带有 CallAfter 方法的线程
这是我的大型机的摘录(因为太大,只摘录了一部分):
[code]
class MyForm(wx.Frame):
#----------------------------------------------------------------------
def __init__(self):
wx.Frame.__init__(self, None, wx.ID_ANY, "ICSOFT", size = (1400,700))
[...]
wx.CallAfter(notdaemon)
[...]
def notdaemon():
import notdaemon
thread = threading.Thread(target=notdaemon.rundaemon(None), args=())
thread.daemon = True
thread.start()
# Run the program
if __name__ == "__main__":
app = wx.App(False)
frame = MyForm()
frame.Show()
app.MainLoop()
这里是 notdaemon 的摘录:
def rundaemon(self):
for i, a in reminders.items():
[...]
notwin = wx.adv.NotificationMessage(u'test', message=msg, parent=None, flags=wx.ICON_INFORMATION)
notwin.Show()
time.sleep(5.5)
因此 GUI 会冻结,直到 运行守护进程显示所有通知。
非常感谢任何想法或帮助,谢谢:)
它挂起是因为当您将它传递给线程时,您实际上是在启动 rundaemon
函数。当您真正打算传递函数本身时,您实际传递的是 return 值。
而不是这个:
thread = threading.Thread(target=notdaemon.rundaemon(None), args=())
试试这个:
# notice the `rundaemon` function hasn't been called yet (parentheses have been removed)
thread = threading.Thread(target=notdaemon.rundaemon, args=())
Thread
模块会为你调用你的函数,所以注意不要自己调用。如果您需要使用参数调用它,请在 Thread
class 初始值设定项的 args
元组中指定这些参数。
总结一下我的问题,我想加载我的程序主布局,但同时 运行 一个后台守护进程来检查数据库中的任务并通知用户。我正在使用 wx.CallAfter 在线程中执行守护程序,但是在加载程序时,GUI 冻结,直到线程处理所有通知然后加载 == 它不会 运行 在后台。
基本上我尝试的是: - 运行 线程中的脚本 - 运行 带有 CallAfter 方法的线程
这是我的大型机的摘录(因为太大,只摘录了一部分):
[code]
class MyForm(wx.Frame):
#----------------------------------------------------------------------
def __init__(self):
wx.Frame.__init__(self, None, wx.ID_ANY, "ICSOFT", size = (1400,700))
[...]
wx.CallAfter(notdaemon)
[...]
def notdaemon():
import notdaemon
thread = threading.Thread(target=notdaemon.rundaemon(None), args=())
thread.daemon = True
thread.start()
# Run the program
if __name__ == "__main__":
app = wx.App(False)
frame = MyForm()
frame.Show()
app.MainLoop()
这里是 notdaemon 的摘录:
def rundaemon(self):
for i, a in reminders.items():
[...]
notwin = wx.adv.NotificationMessage(u'test', message=msg, parent=None, flags=wx.ICON_INFORMATION)
notwin.Show()
time.sleep(5.5)
因此 GUI 会冻结,直到 运行守护进程显示所有通知。
非常感谢任何想法或帮助,谢谢:)
它挂起是因为当您将它传递给线程时,您实际上是在启动 rundaemon
函数。当您真正打算传递函数本身时,您实际传递的是 return 值。
而不是这个:
thread = threading.Thread(target=notdaemon.rundaemon(None), args=())
试试这个:
# notice the `rundaemon` function hasn't been called yet (parentheses have been removed)
thread = threading.Thread(target=notdaemon.rundaemon, args=())
Thread
模块会为你调用你的函数,所以注意不要自己调用。如果您需要使用参数调用它,请在 Thread
class 初始值设定项的 args
元组中指定这些参数。