gpt4 book ai didi

python - wxPython卡在顺序代码中的随机点

转载 作者:行者123 更新时间:2023-12-03 16:44:55 25 4
gpt4 key购买 nike

我有一个简单的应用程序,向您显示一个按钮,当按下按钮时,会完成一些长时间运行的计算(不是在单独的线程中,因此不需要单独的线程,因为这些计算是应用程序的唯一原因) 。这些计算是在for循环中进行的,并且在每次迭代时,for外观都会回调到更新它的主框架,因此它显示当前迭代(相同的是在下面填充了一个小号规)。

    def _delay(self):
for i in range(15000):
self.update_stats(f'{i}', i)

def on_button_click(self, event):
self.init_completion_gauge(15000)
self._delay()
self.set_state_comparison_done()

def init_completion_gauge(self, maxval):
self.gauge.SetRange(maxval)
self.Layout()
self.Update()

def update_stats(self, current_iter, count):
self.label_current_iter.SetLabelText(
'\n'.join((f'Iter:', current_iter)))
self.gauge.SetValue(count)
self.label_percent_complete.SetLabelText(
f'{(count + 1) * 100 // self.gauge.GetRange()}%')
self.Layout()
self.Update()

当此程序运行时,一切顺利进行了几秒钟,然后该应用程序在标题栏中显示 Not responding并挂起,直到完成为止。我的意思不是只举手,也不显示任何错误。由于计算是在主循环中完成的,因此该应用旨在阻止应用程序阻塞主循环,直到完成为止,但是我怀疑随机显示未响应而不进行响应是正常的。计算完成后,应用程序将正常运行,但将在完全随机的点停止响应。

关于为什么发生这种情况的任何建议以及应采取哪些措施解决此问题?

最佳答案

GUI更新已排队。
假设您的代码如下所示:

myLongTask
{
loop:
... do something
UpdateGUI()
end loop
}

每次您调用 UpdateGUI()时,都会向操作系统发送一条消息,并且控件会立即返回并继续循环。

操作系统何时有机会处理该消息?运行该循环太忙了。

您可以使用 wx.Yield或为长任务设置更好的线程,该线程将消息发送到操作系统以请求更新。

查看更多 here

关于python - wxPython卡在顺序代码中的随机点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48525743/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com