執行序計時器 |
|
Hero
一般會員 發表:3 回覆:10 積分:12 註冊:2002-07-11 發送簡訊給我 |
這陣子在找好用的計時器,發現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 發送簡訊給我 |
|
Hero
一般會員 發表:3 回覆:10 積分:12 註冊:2002-07-11 發送簡訊給我 |
用法就跟TTimer一樣,只不過要自己建立和釋放,並且要自己指定觸發的事件。
如果將TThreadTimer包到TComponent就跟TTimer長的一模一樣了(元件版本已發表)。
|
kj68215
初階會員 發表:47 回覆:91 積分:27 註冊:2003-08-09 發送簡訊給我 |
怪怪~~怎麼試都弄不出來耶!
指定觸發的事件不是應該要寫成這樣嗎?↓
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該怎麼正確使用... 是否有更完整的範例呢? 小弟功力很淺,原諒小弟不會運用! ----------------------- 請多多指教啦!!^^ 發表人 -
------
----------------------- 請多多指教啦!!^^ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |