如何避免“不回应”

时间:2011-01-19 08:03:42

标签: delphi delphi-7

  

可能重复:
  Keep app responsive during long task

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

THX

3 个答案:

答案 0 :(得分:4)

在单独的线程中执行它。 (见TThread课程)

答案 1 :(得分:2)

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

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

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

作弊是关于推迟你真正的解决方案 推迟成本比现在更多。

这完全是upstream decisions and downstream costs 稍后做出错误的决定比现在做出正确的决定更加昂贵,并投入一些时间来做正确的事。

修改

使用辅助消息循环的唯一例外是显示模式窗体或对话框时。由于模态,辅助消息循环具有这些消息的受限范围。

编辑2:

该模态导致所有其他形式被自动禁用;然而,定时器和其他非UI消息仍在处理中,因此仍然可以进行重新定位。

- 的Jeroen

答案 2 :(得分:0)

从我的角度来看,你有两个选择(取决于任务(或循环)将花费多长时间):

  • 使用Alexander Malakhov提到的一个帖子;
  • 添加Application.ProcessMessages(强制应用程序绘制UI并响应事件,但如果你想要应用程序,那么在每次循环完成后循环需要花费大量时间 - 使用线程......)作为回应,但我建议它只用于 - 少量的时间循环,对于长密集循环使用线程。