【发布时间】:2021-07-15 07:27:05
【问题描述】:
我正在使用 Delphi 开发一个单线程应用程序,它会执行一项耗时的任务,如下所示:
// time-consuming loop
For I := 0 to 1024 * 65536 do
Begin
DoTask();
End;
当循环开始时,应用程序将失去对最终用户的响应。那不是很好。由于它的复杂性,我也不想将其转换为多线程应用程序,因此我相应地添加了 Application.ProcessMessages,
// time-consuming loop
For I := 0 to 1024 * 65536 do
Begin
DoTask();
Application.ProcessMessages;
End;
不过,这一次应用虽然会响应用户操作,但在循环中消耗的时间比原来的循环要多很多,大约是10倍左右。
是否有解决方案可以确保应用程序不会丢失响应,同时又不会过多增加消耗的时间?
【问题讨论】:
-
每当我看到有人使用
Application.ProcessMessages并想知道为什么事情不正常时,我总是会哭一会儿。 -
把它放在一个线程中。放弃
ProcessMessages。 -
同意 - 它需要一个线程。当然,我可以理解重构复杂遗留应用程序的痛苦。上次我这样做是并行化以前的程序算法的唯一方法。这意味着从几十个单元中提取成百上千个全局变量,重构跨越近万行代码的一百多个方法……一行一行。包括调试,花了几个月的时间。我可以理解想要在像
ProcessMessages这样的快速单行修复下畏缩 - 我的建议是不要。从长远来看,它永远不值得。修复它。 -
也就是说...
if I mod 1000 = 0 then...是修补此罪行的常见嫌疑人。
标签: delphi