这个问题在这里已经有了答案:




10年前关闭。






处理大型查询或长流程循环时如何避免“无响应”?

谢谢

最佳答案

永远不要使用 Application.ProcessMessages ,它会打开一堆蠕虫。
真的。
让我再说一遍:不要使用 Application.ProcessMessages
This is why :它要求您的所有消息始终可重入。
你的消息传递,更重要的是你使用的库中的消息传递(你不能确定它是可重入的)。
现在,以及将来。
即使在您尚未测试的情况下,或者您尚未看到的使用模式。

你应该做多线程。
你真的应该。
正确同步可能需要一些时间,但是使用 backgroundworker 之类的东西以简洁的方式封装了大部分内容。

如果你不能做多线程,那么你可以 cheat
但你不应该作弊。

作弊就是推迟你真正的解决方案。
推迟比现在做成本更高。

这都是关于 upstream decisions and downstream costs 的。
稍后修正错误的决定比现在做出正确的决定要昂贵得多,而且要花一些时间来做正确的决定。

编辑:

使用辅助消息循环的唯一异常(exception)是在显示模式表单或对话框时。由于模式的原因,辅助消息循环在那里限制了这些消息的范围。

编辑 2:

该模式导致所有其他形式自动禁用;然而,计时器和其他非 UI 消息仍在处理中,因此仍可能发生重入。

--杰罗恩

关于delphi - 如何避免 "Not Responding",我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4732998/

10-09 09:33