Timer的Enable為true, 但OnTimer卻進不去的問題… |
答題得分者是:tomoi
|
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
程式碼還蠻簡單的
[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 迴圈裡出不來,不知道為什麼…? |
ikk
尊榮會員 發表:4 回覆:413 積分:768 註冊:2003-06-30 發送簡訊給我 |
|
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
|
tomoi
初階會員 發表:2 回覆:30 積分:41 註冊:2008-07-14 發送簡訊給我 |
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 發送簡訊給我 |
|
tomoi
初階會員 發表:2 回覆:30 積分:41 註冊:2008-07-14 發送簡訊給我 |
我猜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 |
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
謝謝 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 發送簡訊給我 |
我不是本科出身,用詞不當請見諒。
Application->ProcessMessages()是告訴電腦不用再等這個執行緒處理完,可以繼續處理下一個。 以原來的例子來說,跑到Button2的while loop後,Timer還不會運行,因為它在等這個while loop處理完才會繼續做下一步。 加了Application->ProcessMessages() Timer才會有動作,可以想成while loop也是一邊跑,直到Timer->Enable==false 至於使用TNotifyEvent是避免Button1Click還沒完成後又觸發一次Button1Click, 因為Application->ProcessMessages()的關係,Button1Click可能還沒等Button2Click做完又再觸發一次 不過我想在這個例子裡可能沒差吧
------
Tomo |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |