如何在TForm.Caption中避免“(不响应)”?

时间:2013-06-14 10:52:43

标签: multithreading delphi delphi-xe2

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

如果用户点击了用户界面,我在表单标题中显示“无响应”。

Application.ProcessMessages不起作用。

我想添加一个“选框进度条”,而不是“没有回应”。

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

感谢。

2 个答案:

答案 0 :(得分:11)

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

您需要将长时间运行的代码移动到单独的线程中。这是唯一可行的解​​决方案。你试图调用ProcessMessages无疑会失败,因为它们需要从脚本内部产生影响。无论如何,调用ProcessMessages永远不是问题的真正解决方案,应该避免使用。

答案 1 :(得分:1)

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