首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何等待TTimer完成?

如何等待TTimer完成?
EN

Stack Overflow用户
提问于 2009-11-23 02:54:02
回答 4查看 1.6K关注 0票数 3

我有一个带有TTimer (timAnimateDataChange)的TFrame (fraDisplay)。定时器用于控制一个小动画。在包含框架的表单中,我希望有一个方法执行以下操作:

代码语言:javascript
复制
procedure TForm.DoStuff;
begin
   DoSomeLogicStuff;
   fraDisplay.AnimateResult;
   WaitForAnimationToFinish;
   DoSomeOtherLogicStuff;
   fraDisplay.AnimateEndResult;
   WaitForAnimationToFinish;
   fraDisplay.Finalize;
end;

动画基本上是TImage32的重绘,由计时器计时。完成时计时器将自动禁用它,并且帧有一个名为AnimationRunning的布尔值属性,该属性将在动画完成时设置为false。

没有线程或类似的东西来使问题复杂化或帮助问题。

问题是,我如何实现WaitForAnimationToFinish-method?

(顺便说一句,这不是一个好的解决方案:

代码语言:javascript
复制
procedure TForm.WaitForAnimationToFinish;
begin
  repeat 
    Application.ProcessMessages;
  until not fraDisplay.AnimationRunning;
end;

由于计时器不会在方法运行时触发:-( )

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-11-23 03:15:53

Smasher's suggestion可以使用Delphi2009的匿名方法来实现。

代码语言:javascript
复制
procedure TForm.DoStuff;
begin
  DoSomeLogicStuff;
  fraDisplay.AnimateResult.OnFinished := 
    procedure (Sender: TObject)
    begin
      DoSomeOtherLogicStuff;
      fraDisplay.AnimateEndResult.OnFinished := 
        procedure (Sender: TObject)
        begin
          fraDisplay.Finalize;
        end;
      fraDisplay.AnimateEndResult;
    end;
  fraDisplay.AnimateResult;
end;

顺便说一下:实际上,WaitForAnimationToFinish会让OnTimer触发,因为它使用在调用ProcessMessages时调度的windows消息。但无论如何,这是一个糟糕的想法,因为它使用了大量的CPU,但实际上并不需要它。

票数 2
EN

Stack Overflow用户

发布于 2009-11-23 03:07:34

当计时器禁用自身并将AnimationRunning变量设置为False时,您只需调用下一步应该执行的方法。

票数 1
EN

Stack Overflow用户

发布于 2009-11-23 16:17:14

一位斯诺尼亚的Delphi程序员写的正是你要找的代码-- Active Sleep

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1779600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档