【发布时间】:2015-06-24 12:22:58
【问题描述】:
我需要一种方法来暂停函数的执行几秒钟。我知道我可以使用 sleep 方法来做到这一点,但是这种方法在应用程序执行时会“冻结”应用程序。我也知道我可以使用下面的代码来避免冻结:
// sleeps for 5 seconds without freezing
for i := 1 to 5 do
begin
sleep(1000);
application.processmessages;
end;
这种方法有两个问题:一个是冻结仍然每秒发生,第二个问题是每秒调用“application.processmessages”。我的应用程序是 CPU 密集型的,每个 processmessages 调用都会做很多不必要的工作,这些工作会占用不必要的 CPU 资源;我只想暂停工作流程,仅此而已。
我真正需要的是一种像 TTimer 一样暂停执行的方法,在下面的示例中:
// sleeps for 5 seconds
mytimer.interval := 5000;
mytimer.enabled := true;
// wait the timer executes
// then continue the flow
// running myfunction
myfunction;
这种方法的问题是 'myfunction' 不会等待 mytimer,它会在 mytimer 启用后立即运行。
还有其他方法可以实现我想要的暂停吗?
提前致谢。
【问题讨论】:
-
所以我最好的选择是使用大量的 TTimer 和我想要的暂停?
-
“每个 processmessages 调用都会做很多不必要的工作”这句话让我有点困惑。 ProcessMessages 是不是类似于应用程序不冻结时所做的事情?因此,如果 not freeze 正在做 不必要的工作,这应该是首先要修复的区域。
-
出于各种原因,我在各种应用程序中做过类似的事情。重要的是,这取决于您需要暂停它的原因 - 这将指导您可以使用什么方法来处理它。
-
@UweRaabe:不完全是。当您让消息循环正常工作时,主线程在没有消息要处理的时候进入高效睡眠状态。通过在循环中调用
ProcessMessages(),主线程不再休眠,即使没有消息等待处理,轮询消息队列也有开销。 -
I need a way to pause the execution of a function for some seconds-- 为什么? 我们应该通过接受的答案来猜测吗?帮我们(和未来的访客)一个忙,并详细说明您的具体问题。谢谢:)
标签: windows delphi delphi-7 delphi-2007