Delphi 如何避免;“没有回应”;
可能重复:Delphi 如何避免;“没有回应”;,delphi,delphi-7,Delphi,Delphi 7,可能重复: 在处理大型查询或长流程循环时,如何避免“不响应” thx在单独的线程中执行它。(请参阅TThread类)从我的角度来看,您有两个选择(取决于任务(或循环)所需的时间): 使用Alexander Malakhov提到的线 如果希望应用程序响应,请在每次循环完成后添加Application.ProcessMessages(强制应用程序绘制UI并响应事件,但在循环花费大量时间时效果不佳--请使用thread..),但我建议仅在-少量时间-循环时使用,对于长时间密集型循环,使用线程 永远
在处理大型查询或长流程循环时,如何避免“不响应”
thx在单独的线程中执行它。(请参阅TThread类)从我的角度来看,您有两个选择(取决于任务(或循环)所需的时间):
- 使用Alexander Malakhov提到的线李>
- 如果希望应用程序响应,请在每次循环完成后添加Application.ProcessMessages(强制应用程序绘制UI并响应事件,但在循环花费大量时间时效果不佳--请使用thread..),但我建议仅在-少量时间-循环时使用,对于长时间密集型循环,使用线程
- 永远不要使用
应用程序。处理消息
,它会打开一罐蠕虫。真的。
让我重复一次:不要使用
Application.ProcessMessages
:它要求您的所有消息始终是可重入的。
您的消息传递,更重要的是您使用的库中的消息传递(您无法确定它是否可重入)。
现在和将来。
即使在您尚未测试的情况下,或者您尚未看到的使用模式 您应该执行多线程。
你真的应该这样。
可能需要一些时间才能正确地进行同步,但是使用像a这样的东西可以以一种简洁的方式封装大部分 如果您不能执行多线程,那么您可以。
但是你不应该作弊 作弊就是推迟你真正的解决方案。
推迟要比现在做花费更多 这就是一切。
晚些时候修正一个错误的决定比现在做出正确的决定要昂贵得多,而且要花一点时间去做正确的决定 编辑: 使用辅助消息循环的唯一例外是在显示模式窗体或对话框时。在那里,由于模态的原因,次要消息循环对这些消息的影响有限 编辑2: 该模态导致所有其他形式被自动禁用;但是,计时器和其他非UI消息仍在处理中,因此仍可能发生重入
--杰伦不,不,不,不!不要使用应用程序。处理消息;它有太多的副作用()并且要求所有的消息处理始终是可重入的。不仅仅是你的信息处理。无论是现在还是将来,应用程序中的任何位置都可以处理所有消息。不要+1是的,Jeroen,但是如果他是一个初学者,这将帮助他(希望)理解线程的真正价值,如果他不是初学者,那么他已经知道,无论如何,你是对的,但是出于他的目的,它可能会起到作用。这就是我在回答中建议backgroundworker的原因。它使多线程的使用变得更加容易。这种针对
应用程序.ProcessMessages
的咆哮有点令人厌烦。如果代码不可重入,运行辅助消息循环只会出现问题,但这本身就是一个有价值的属性。简单地将代码移动到工作线程可能会产生与应用程序相同的问题。ProcessMessages必须确保无法重新输入任何不安全的代码路径。因为工作线程仍在运行而需要禁用按钮与因为调用的代码包含应用程序而必须禁用按钮之间没有区别。ProcessMessages
@Jeroen我靠一个调用应用程序的程序谋生。ProcessMessages
没有问题,所以可以这样做。但是,是的,线程更好。@mghie:我同意两者都需要相当多的努力才能正确。我自己也曾被这两个人咬过,线程的伤痕比应用程序.ProcessMessages要少,因为它更容易屏蔽线程的副作用,而消息处理咬了我一口,因为其他人的代码对我产生了反作用(有一个漏洞,用户仍然可以执行操作)。也许其他人有不同的体验,但要正确处理消息是很困难的,因为它更难控制。我投票反对应用程序。ProcessMessages:我使用的是FastReports,这是一个很好的报告框架,但作者有一个绝妙的想法,从报告引擎调用Application.ProcessMessages
。这是非常难看的:如果出于任何原因,报告显示时间超过了一秒钟,用户可以自由地再次按下Print
按钮。按照电梯的最佳实践,他们可能会多次按下按钮,以防万一。屏蔽这需要很多不必要的工作!杰伦:请写一篇关于这个的博文!!!