1

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

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

Application.ProcessMessages不起作用。

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

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

谢谢。

4

2 回答 2

11

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

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

于 2013-06-14T11:00:20.537 回答
1

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

于 2013-06-14T13:24:26.833 回答