Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何避免;“没有回应”;_Delphi_Delphi 7 - Fatal编程技术网

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
      按钮。按照电梯的最佳实践,他们可能会多次按下按钮,以防万一。屏蔽这需要很多不必要的工作!杰伦:请写一篇关于这个的博文!!!