【问题标题】:how to avoid "(not responding)" in TForm.Caption?如何避免 TForm.Caption 中出现“(不响应)”?
【发布时间】:2013-06-14 10:52:43
【问题描述】:

在主 VCL 线程中,我运行了一个脚本,该脚本可能需要几分钟才能执行(它是一个恢复数据库脚本)。

如果用户点击 UI,我在表单标题中显示“未响应”。

Application.ProcessMessages 不起作用。

我想添加一个“字幕进度条”而不是“无响应”。

是在线程中运行 Db 脚本的唯一解决方案吗?

谢谢。

【问题讨论】:

  • 是的,将慢速代码放在单独的线程中是正确的做法(可能是唯一合理的做法)。

标签: multithreading delphi delphi-xe2


【解决方案1】:

您的长时间运行的任务正在 GUI 线程上运行,它阻塞了 GUI 线程。 GUI 线程必须及时为其消息队列提供服务。

您需要将长时间运行的代码移至单独的线程。这是唯一可行的解​​决方案。您拨打ProcessMessages 的尝试无疑会失败,因为它们需要从脚本内部进行才能产生任何影响。在任何情况下,调用ProcessMessages 从来都不是问题的真正解决方案,应该避免。

【讨论】:

  • 就是这样。完美的答案。
  • +1 想强调一点,调用ProcessMessages 会使应用程序面临在处理另一个事件的过程中处理另一个事件的风险。 IE。第二个事件可能在“不稳定”状态下运行。这是一种极其危险的情况。虽然可以添加丑陋的代码来防范风险,但最好完全避免该问题。
【解决方案2】:

David 的线程解决方案是最佳答案,我投了赞成票。但是为了完整起见,有时可以使用另一种方法。如果数据库引擎有 OnProgress 通知(回调),这可用于更新状态/进度,在这种情况下,对 ProcessMessages 的调用将起作用。有时这就是您所需要的,但仅限于非常简单的情况,例如当您显示“进度”对话框时,并且在您完成之前不希望用户执行任何其他操作。

【讨论】:

  • 我同意线程是最好的解决方案,无论如何线程也在我的问题中,所以这个 OnProgress 想法对我来说是新的,我会调查,因为我使用 SQLServer(并且从管理工作室我可以看到进度 - 以 % 为单位 - 随着数据库的恢复),所以我只需要找出如何使用我的 DAC(来自 Devart 的 SDAC)来做到这一点。
  • @user 你了解调用 ProcessMessages 的所有含义吗?
猜你喜欢
  • 1970-01-01
  • 2013-01-26
  • 2014-07-06
  • 1970-01-01
  • 1970-01-01
  • 2018-11-21
  • 1970-01-01
  • 1970-01-01
  • 2017-06-16
相关资源
最近更新 更多