Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
Multithreading 如何避免;(没有回应)“;在TForm.Caption中?_Multithreading_Delphi_Delphi Xe2 - Fatal编程技术网

Multithreading 如何避免;(没有回应)“;在TForm.Caption中?

Multithreading 如何避免;(没有回应)“;在TForm.Caption中?,multithreading,delphi,delphi-xe2,Multithreading,Delphi,Delphi Xe2,在主VCL线程中,我运行了一个可能需要几分钟才能执行的脚本(它是一个还原数据库脚本) 如果用户单击UI,我会在表单标题中显示“未响应” Application.ProcessMessages不起作用 我想添加一个“字幕进度条”,而不是“没有响应” 唯一的解决方案是在线程中运行Db脚本吗 谢谢。您的长时间运行任务正在GUI线程上运行,它正在阻止GUI线程。GUI线程必须及时为其消息队列提供服务 您需要将长时间运行的代码移动到单独的线程。这是唯一可行的解决办法。调用ProcessMessages的尝

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

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

Application.ProcessMessages
不起作用

我想添加一个“字幕进度条”,而不是“没有响应”

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


谢谢。

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


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

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


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

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

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

是的,将缓慢的代码放在单独的线程中是正确的做法(可能是唯一合理的做法)。是的,将缓慢的代码放在单独的线程中是正确的做法(可能是唯一合理的做法),就是这样。完美的答案。+ 1想强调的一点是,调用<代码> PrimeStudio将应用程序暴露在处理另一个事件的过程中的事件的风险中。即,第二个事件可能在“不稳定”状态下运行。这是一个极其危险的局面。虽然可以添加丑陋的代码来防范风险,但最好完全避免问题,就是这样。完美的答案。+ 1想强调的一点是,调用<代码> PrimeStudio将应用程序暴露在处理另一个事件的过程中的事件的风险中。即,第二个事件可能在“不稳定”状态下运行。这是一个极其危险的局面。虽然可以添加难看的代码来防范风险,但最好完全避免这个问题。我同意线程是最好的解决方案,不管怎样,线程也是我的问题,所以这个OnProgress想法对我来说是新的,我将进行调查,因为我使用SQLServer(从ManagementStudio中,我可以看到数据库恢复时的进度%),所以我只需要了解如何使用我的DAC(Devart提供的SDAC)来实现这一点@user您了解调用ProcessMessages的所有含义吗?我同意线程是最好的解决方案,无论如何,线程也是我的问题,所以这个OnProgress想法对我来说是新的,我将进行研究,因为我使用SQLServer(从management studio中,我可以看到一个Progress-in%-作为数据库的恢复),所以我只需要了解如何使用我的DAC(来自Devart的SDAC)来执行此操作。@user您了解调用ProcessMessages的所有含义吗?