[英]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.