咨询:Tkinter多线程应用中mainloop增加处理时长的优化方案
关于Tkinter加载窗口导致处理时间增加的问题
我在自己的应用里做了这么个功能:有一个运行在独立线程的进程,它需要耗时数秒完成,而且只需要执行一次。同时我做了个加载窗口,一方面用来告知用户应用还在正常运行,另一方面允许用户取消这个进程——这个加载窗口会每0.5秒调用一次函数,循环更新提示信息为Processing.、Processing..或Processing...。
但问题来了:添加这个加载窗口之后,进程的处理时间显著增加了。下面是两种不同场景下的实现代码:
无加载窗口的实现
processing_thread.start() processing_thread.join()
有加载窗口的实现
processing_thread.start() loading_window = LoadingWindow() while processing_thread.is_alive(): try: loading_window.window.update_idletasks() loading_window.window.update() except TclError: return
注:我并没有使用
mainloop,而是采用了一种等效实现,既能检查进程是否仍在运行,又相当于把join和mainloop的功能结合在了一起。我也测试过直接使用mainloop(),但处理时间并没有得到显著改善。
当前的临时解决方案
为了降低处理时间,我尝试减慢循环速度,在主线程中增加了空闲时间:
processing_thread.start() loading_window = LoadingWindow() while processing_thread.is_alive(): try: loading_window.window.update_idletasks() loading_window.window.update() time.sleep(0.5) except TclError: return
这个方法确实把处理时间降到了和无加载窗口时相近的水平,但也带来了两个新问题:
- 应用的响应速度变慢(最坏情况下会有0.5秒的延迟)
- 进程结束后,应用会延迟一段时间才退出(最坏情况也是0.5秒)
想请教的问题
有没有什么实现方式可以避免这两个弊端?使用multiprocessing能不能解决这个问题?
内容的提问来源于stack exchange,提问作者Olivier Samson
相关产品推荐
相关产品推荐

