線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2349
推到 Plurk!
推到 Facebook!

執行序計時器

 
Hero
一般會員


發表:3
回覆:10
積分:12
註冊:2002-07-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-09-13 17:51:25 IP:61.228.xxx.xxx 未訂閱
這陣子在找好用的計時器,發現Dalman分享的_TThreadTimer,參考後改成BCB的版本;如有意見歡迎討論。 【完整程式碼】 TThreadTimer.h //--------------------------------------------------------------------------- // 執行序計時器 //--------------------------------------------------------------------------- class TThreadTimer : public TThread { private: TNotifyEvent FOnTimer; int FInterval; TEvent *FEvent; bool __fastcall GetEnabled(); void __fastcall SetEnabled(bool value); void __fastcall DoTimer(); protected: void __fastcall Execute(); public: __fastcall TThreadTimer(); __fastcall ~TThreadTimer(); __property int Interval = { read=FInterval, write=FInterval }; __property bool Enabled = { read=GetEnabled, write=SetEnabled }; __property TNotifyEvent OnTimer = { read=FOnTimer, write=FOnTimer }; }; TThreadTimer.cpp //--------------------------------------------------------------------------- // 執行序計時器 //--------------------------------------------------------------------------- __fastcall TThreadTimer::TThreadTimer() : TThread(true) { FEvent = new TEvent(NULL, false, false, NULL); Priority = tpNormal; FInterval = 1000; FreeOnTerminate = false; } //--------------------------------------------------------------------------- __fastcall TThreadTimer::~TThreadTimer() { Terminate(); FEvent->SetEvent(); if (Suspended) Resume(); WaitFor(); FEvent->Free(); } //--------------------------------------------------------------------------- void __fastcall TThreadTimer::Execute() { while (!Terminated) { if (FEvent->WaitFor(FInterval) == wrTimeout) Synchronize(DoTimer); } } //--------------------------------------------------------------------------- void __fastcall TThreadTimer::DoTimer() { if (FOnTimer) FOnTimer(this); } //--------------------------------------------------------------------------- bool __fastcall TThreadTimer::GetEnabled() { return !Suspended; } //--------------------------------------------------------------------------- void __fastcall TThreadTimer::SetEnabled(bool value) { Suspended = !value; } 發表人 - hero 於 2003/09/13 17:53:04
blck
一般會員


發表:17
回覆:19
積分:12
註冊:2003-08-02

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-09-13 23:07:00 IP:61.187.xxx.xxx 未訂閱
很好啊 可是就是有點抽象,能不能給一個具體的應用例子?
Hero
一般會員


發表:3
回覆:10
積分:12
註冊:2002-07-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-09-14 01:09:53 IP:61.228.xxx.xxx 未訂閱
用法就跟TTimer一樣,只不過要自己建立和釋放,並且要自己指定觸發的事件。 如果將TThreadTimer包到TComponent就跟TTimer長的一模一樣了(元件版本已發表)。 宣告 TThreadTimer *ThreadTimer; void __fastcall MyTimerEvent(TObject *Sender); 實做 ThreadTimer = new TThreadTime(); //自己新建一個物件 ThreadTimer->OnTimer = MyTimerEvent; //指定觸發的事件 ThreadTimer->Interval = 5000; //豪秒 ThreadTimer->Enabled = true; //啟動計時器 //經過設定的時間後會觸發執行MyTimerEvent //此處和TTimer最大的不同是MyTimerEvent執行完之後才會再次計數 發表人 - hero 於 2003/09/14 01:13:25 發表人 - hero 於 2003/09/14 15:51:19
kj68215
初階會員


發表:47
回覆:91
積分:27
註冊:2003-08-09

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-04-24 08:00:47 IP:61.219.xxx.xxx 未訂閱
怪怪~~怎麼試都弄不出來耶! 指定觸發的事件不是應該要寫成這樣嗎?↓
ThreadTimer->OnTimer = &MyTimerEvent;
小弟是這樣寫的↓ Unit.cpp
TThreadTimer *ThreadTimer; //設為全域
//---------------------------------------------------------------------------    void __fastcall TForm1::ThreadTimer1Timer(TObject *Sender)
{
ThreadTimer = new TThreadTime(); //自己新建一個物件
ThreadTimer->OnTimer = &Label1; //指定觸發的事件
ThreadTimer->Interval = 5000; //豪秒
ThreadTimer->Enabled = true; //啟動計時器
}
//---------------------------------------------------------------------------    void __fastcall TForm1::Label1Click(TObject *Sender)
{
   Label1->Caption = Now().FormatString("hh:nn:ss");
}
//---------------------------------------------------------------------------
問題就是出在FormCreate的tt = new TThreadTimer(); 錯誤訊息是↓ [C Error] Unit1.cpp(21): E2303 Type name expected [C Error] Unit1.cpp(21): E2034 Cannot convert 'int *' to 'TThreadTimer *' [C Error] Unit1.cpp(21): E2379 Statement missing ; [C Error] Unit1.cpp(22): E2034 Cannot convert 'TLabel * *' to 'void (_fastcall * (_closure )(TObject *))(TObject *)' 實在不知道這TThreadTimer該怎麼正確使用... 是否有更完整的範例呢? 小弟功力很淺,原諒小弟不會運用! ----------------------- 請多多指教啦!!^^ 發表人 -
------
-----------------------
請多多指教啦!!^^
系統時間:2024-07-02 2:40:55
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!