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

Timer的Enable為true, 但OnTimer卻進不去的問題…

答題得分者是:tomoi
GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-01-22 11:31:31 IP:203.75.xxx.xxx 未訂閱
程式碼還蠻簡單的
[code cpp]
void __fastcall TForm1::Button1Click(TObject *Sender)
{
while(true)
Button2->Click();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
while(Timer1->Enabled == true)
{
// 註:Timer->Interval 為 100
Sleep(500);
}

Timer1->Enabled = true;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
static int c = 1;
this->Caption = c;
c ;

Timer1->Enabled = false;
}
//---------------------------------------------------------------------------
[/code]
我按下Button1之後,程式就會卡在Button2Click 裡的 while 迴圈裡出不來,不知道為什麼…?
編輯記錄
GrandRURU 重新編輯於 2009-01-22 12:03:39, 註解 增加連點button‧
GrandRURU 重新編輯於 2009-01-22 12:05:29, 註解 無‧
GrandRURU 重新編輯於 2009-01-22 16:12:01, 註解 無‧
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-01-22 11:44:32 IP:140.116.xxx.xxx 訂閱
我試過, 沒有這種現象...........
有其他code干擾 timer ?
------
FPGA驗證, FPGA開發平台, http://smims.com
GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-01-22 11:53:32 IP:203.75.xxx.xxx 未訂閱
我是開新專案,理論上應該沒有其它的code了
但快速的連點就會發生死鎖… ><

===================引 用 ikk 文 章===================
我試過, 沒有這種現象...........
有其他code干擾 timer ?
tomoi
初階會員


發表:2
回覆:30
積分:41
註冊:2008-07-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-01-22 16:02:08 IP:59.120.xxx.xxx 訂閱
void __fastcall TForm1::Button1Click(TObject *Sender)
{
while(true)
Button1->Click();
}

問一下為什麼按下Button1會觸發Button2??
@_@

===================引 用 GrandRURU 文 章===================
程式碼還蠻簡單的
[code cpp]
void __fastcall TForm1::Button1Click(TObject *Sender)
{
while(true)
Button1->Click();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
while(Timer1->Enabled == true)
{
// 註:Timer->Interval 為 100
Sleep(500);
}

Timer1->Enabled = true;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
static int c = 1;
this->Caption = c;
c ;

Timer1->Enabled = false;
}
//---------------------------------------------------------------------------
[/code]
我按下Button1之後,程式就會卡在Button2Click 裡的 while 迴圈裡出不來,不知道為什麼…?
------
Tomo
GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-01-22 16:12:51 IP:203.75.xxx.xxx 未訂閱
我…打太快打錯了…(逃)
已修正
tomoi
初階會員


發表:2
回覆:30
積分:41
註冊:2008-07-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-01-22 16:13:51 IP:59.120.xxx.xxx 訂閱
我猜G兄是想寫成這樣吧
加入Application->ProcessMessages();
Timer才會有作用

下方的"On Click"變成forbiden? @_@

[code cpp]
void __fastcall TForm4::Button1Click(TObject *Sender)
{
TNotifyEvent evt;
evt=Button1->OnClick;
while(true)
{
Button1->NULL;
Button2->Click();
Button1->evt;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm4::Button2Click(TObject *Sender)
{
while(Timer1->Enabled == true)
{
// 註:Timer->Interval 為 100
Sleep(500);
Application->ProcessMessages();
}

Timer1->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm4::Timer1Timer(TObject *Sender)
{
static int c = 1;
this->Caption = c;
c ;

Timer1->Enabled = false;

}
//---------------------------------------------------------------------------

[/code]
------
Tomo
編輯記錄
tomoi 重新編輯於 2009-01-22 16:15:50, 註解 無‧
tomoi 重新編輯於 2009-01-22 16:16:35, 註解 無‧
GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-01-22 17:16:00 IP:203.75.xxx.xxx 未訂閱
謝謝 tomoi兄的指導,Timer真的有運作了 (大心)
但不了解為什麼加了Application->ProcessMessages()才會運作正常(趴)

另外…「TNotifyEvent 」是做什麼用的呢?
我還是第一次看到這個類別……

為什麼要這樣做呢???

又,"On Click"變成forbiden? ←這個好像是Ktop程式轉碼的一個bug,就…空一格吧…只要能看得懂就ok嚕~

===================引 用 tomoi 文 章===================
我猜G兄是想寫成這樣吧
加入Application->ProcessMessages();
Timer才會有作用

下方的"On Click"變成forbiden? @_@

[code cpp]
void __fastcall TForm4::Button1Click(TObject *Sender)
{
TNotifyEvent evt;
evt=Button1->On Click;
while(true)
{
Button1->On Click=NULL;
Button2->Click();
Button1->On Click=evt;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm4::Button2Click(TObject *Sender)
{
while(Timer1->Enabled == true)
{
// 註:Timer->Interval 為 100
Sleep(500);
Application->ProcessMessages();
}

Timer1->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm4::Timer1Timer(TObject *Sender)
{
static int c = 1;
this->Caption = c;
c ;

Timer1->Enabled = false;

}
//---------------------------------------------------------------------------

[/code]
tomoi
初階會員


發表:2
回覆:30
積分:41
註冊:2008-07-14

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-01-22 20:27:45 IP:220.139.xxx.xxx 訂閱
我不是本科出身,用詞不當請見諒。
Application->ProcessMessages()是告訴電腦不用再等這個執行緒處理完,可以繼續處理下一個。

以原來的例子來說,跑到Button2的while loop後,Timer還不會運行,因為它在等這個while loop處理完才會繼續做下一步。
加了Application->ProcessMessages()
Timer才會有動作,可以想成while loop也是一邊跑,直到Timer->Enable==false


至於使用TNotifyEvent是避免Button1Click還沒完成後又觸發一次Button1Click,
因為Application->ProcessMessages()的關係,Button1Click可能還沒等Button2Click做完又再觸發一次
不過我想在這個例子裡可能沒差吧

------
Tomo
系統時間:2024-03-29 14:29:55
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!