簡體   English   中英

我如何等待TTimer完成?

[英]How do I wait for a TTimer to finish?

我有一個帶有TTimer(timAnimateDataChange)的TFrame(fraDisplay)。 計時器用於控制小動畫。 在包含框架的表單中,我希望有一個類似這樣的方法:

procedure TForm.DoStuff;
begin
   DoSomeLogicStuff;
   fraDisplay.AnimateResult;
   WaitForAnimationToFinish;
   DoSomeOtherLogicStuff;
   fraDisplay.AnimateEndResult;
   WaitForAnimationToFinish;
   fraDisplay.Finalize;
end;

動畫基本上是由TImage32重繪,由計時器計時。 完成時計時器將自動禁用它,並且幀具有名為AnimationRunning的布爾屬性,當動畫結束時,該屬性將設置為false。

沒有任何線索或類似的東西可以使事情變得復雜或有幫助。

問題是,我如何實現WaitForAnimationToFinish方法?

(順便說一句,這不是一個好的解決方案:

procedure TForm.WaitForAnimationToFinish;
begin
  repeat 
    Application.ProcessMessages;
  until not fraDisplay.AnimationRunning;
end;

因為在方法運行時計時器不會觸發:-()

Smasher的建議可以使用Delphi 2009的匿名方法實現。

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;

BTW:實際上,WaitForAnimationToFinish會讓OnTimer激活,因為它使用在調用ProcessMessages時調度的Windows消息。 但無論如何它都是一個壞主意,因為它使用了大量的CPU而實際上並不需要它。

當計時器禁用自身並將AnimationRunning變量設置為False ,您可以調用下一個應該執行的方法。

斯洛文尼亞的Delphi程序員只寫了你正在尋找的代碼 - Active Sleep

那么你的計時器正在做什么是長時間的,大約幾秒鍾? 無論如何,不​​應該在主GUI循環中執行那種長時間運行的活動。 也不應該等待:

當你等待動畫完成時(如果可以的話),你的應用程序的其余部分將表現得像死程序,即它不會以任何方式響應GUI,包括調整大小,重繪,用X關閉,等等

解決方案是將DoStuff方法分解為兩個; 一個啟動計時器活動,另一個啟動計時器完成。 要完成后者,那個計時器應該在說再見之前調用你的第二種方法。

拉斯在組織榜樣方面做得很好; 考慮這本書與他的電影:)

使AnimateResults在完成后調用要調用的方法的參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM