關於狀態切換問題 |
答題得分者是:blk5743
|
iii0628
一般會員 發表:50 回覆:46 積分:19 註冊:2005-04-04 發送簡訊給我 |
請問我現在運作的順序是狀態1->狀態2->狀態3->狀態1->狀態2->狀態3...
,我現在無法寫出這運作的順序,我是用for迴圈寫的但是不會切換(切換時間我已經設定好了)
狀態1.
Shape1->Brush->Color = clGreen; Shape2->Brush->Color = clBlack; Shape3->Brush->Color = clBlack;狀態2. Shape1->Brush->Color = clBlack; Shape2->Brush->Color = clYellow; Shape3->Brush->Color = clBlack;狀態3. Shape1->Brush->Color = clBlack; Shape2->Brush->Color = clBlack; Shape3->Brush->Color = clRed;這是2種狀態切換,我是參考板上的文章... if (flag) { Shape1->Brush->Color = clGreen; Shape2->Brush->Color = clBlack; Shape3->Brush->Color = clBlack; flag=false; }else { Shape1->Brush->Color = clBlack; Shape2->Brush->Color = clYellow; Shape3->Brush->Color = clBlack; flag=true; } |
blk5743
高階會員 發表:34 回覆:371 積分:236 註冊:2003-11-17 發送簡訊給我 |
iii0628你好 你可以宣告一個變數來解決
int i = 1; if ( i == 1 ) {//狀態3. Shape1->Brush->Color = clGreen; Shape2->Brush->Color = clBlack; Shape3->Brush->Color = clBlack; i ;//下一次變狀態2 } else if ( i == 2 ) {//狀態2. Shape1->Brush->Color = clBlack; Shape2->Brush->Color = clYellow; Shape3->Brush->Color = clBlack; i ;//下一次變狀態3 } else {//狀態3. Shape1->Brush->Color = clBlack; Shape2->Brush->Color = clBlack; Shape3->Brush->Color = clRed; i = 1;//下一次變狀態1 } |
iii0628
一般會員 發表:50 回覆:46 積分:19 註冊:2005-04-04 發送簡訊給我 |
以解決,改用版上有位大大寫的DELAY副函式就OK了...
引言: 請問我現在運作的順序是狀態1->狀態2->狀態3->狀態1->狀態2->狀態3... ,我現在無法寫出這運作的順序,我是用for迴圈寫的但是不會切換(切換時間我已經設定好了) 狀態1.Shape1->Brush->Color = clGreen; Shape2->Brush->Color = clBlack; Shape3->Brush->Color = clBlack;狀態2.Shape1->Brush->Color = clBlack; Shape2->Brush->Color = clYellow; Shape3->Brush->Color = clBlack;狀態3.Shape1->Brush->Color = clBlack; Shape2->Brush->Color = clBlack; Shape3->Brush->Color = clRed;這是2種狀態切換,我是參考板上的文章...if (flag) { Shape1->Brush->Color = clGreen; Shape2->Brush->Color = clBlack; Shape3->Brush->Color = clBlack; flag=false; }else { Shape1->Brush->Color = clBlack; Shape2->Brush->Color = clYellow; Shape3->Brush->Color = clBlack; flag=true; } |
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
blk5743
高階會員 發表:34 回覆:371 積分:236 註冊:2003-11-17 發送簡訊給我 |
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
iii0628
一般會員 發表:50 回覆:46 積分:19 註冊:2005-04-04 發送簡訊給我 |
應該是我表達的方式錯了,讓大家誤會。我把我的程式PO出來那大家解悶一下吧,不好意思囉....這是紅綠燈....哈哈哈
void Delay(DWORD Msecs) { DWORD BeginTime = GetTickCount(); do{ Application->ProcessMessages(); }while((GetTickCount() - BeginTime) < Msecs); } void __fastcall TForm1::Timer1Timer(TObject *Sender) { Shape1->Brush->Color = clGreen; Shape2->Brush->Color = clBlack; Shape3->Brush->Color = clBlack; Shape4->Brush->Style = bsClear; Delay(2000); Shape1->Brush->Color = clBlack; Shape2->Brush->Color = clYellow; Shape3->Brush->Color = clBlack; Shape4->Brush->Style = bsClear; Delay(500); Shape1->Brush->Color = clBlack; Shape2->Brush->Color = clBlack; Shape3->Brush->Color = clRed; Shape4->Brush->Style = bsClear; Delay(2000); } |
blk5743
高階會員 發表:34 回覆:371 積分:236 註冊:2003-11-17 發送簡訊給我 |
iii0628你好 我不建議你用你現在用的Delay function
你可以做兩個按鈕來測試一下你的Delay function及BCB雲來就支援的Sleep()
再打開工作管理員來比較兩個效能 Sleep的最小單位是ms,我想它應該非常適合你紅綠燈的使用,而且也不佔什麼CPU效能
如果你用Delay的話,會一直執行while迴圈,CPU佔用率會到100%,
對多工環境非常不利(效能被你吃光了) 以下寫個小範例給你參考
void Delay(DWORD Msecs) { DWORD BeginTime = GetTickCount(); do{ Application->ProcessMessages(); }while((GetTickCount() - BeginTime) < Msecs); } void __fastcall TForm1::Button1Click(TObject *Sender) { Label1->Caption = "1"; Application->ProcessMessages(); Delay(10000); Label1->Caption = "11"; Application->ProcessMessages(); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { Label1->Caption = "2"; Application->ProcessMessages(); Sleep(10000); Label1->Caption = "22"; Application->ProcessMessages(); } |
iii0628
一般會員 發表:50 回覆:46 積分:19 註冊:2005-04-04 發送簡訊給我 |
blk5743 你好:我將我程式DELAY的地方都改為Sleep的話,紅綠燈並不會切換哩,可以麻煩你說明一下Sleep的原理嗎???我一個燈號都Sleep(1000)但是只會顯示最後的紅燈而以,也不會重複切換。不過使用效率上Sleep佔了16%比起DELAY100%來說的話是好多。
謝謝
引言: iii0628你好 我不建議你用你現在用的Delay function 你可以做兩個按鈕來測試一下你的Delay function及BCB雲來就支援的Sleep() 再打開工作管理員來比較兩個效能 Sleep的最小單位是ms,我想它應該非常適合你紅綠燈的使用,而且也不佔什麼CPU效能 如果你用Delay的話,會一直執行while迴圈,CPU佔用率會到100%, 對多工環境非常不利(效能被你吃光了) 以下寫個小範例給你參考void Delay(DWORD Msecs) { DWORD BeginTime = GetTickCount(); do{ Application->ProcessMessages(); }while((GetTickCount() - BeginTime) < Msecs); } void __fastcall TForm1::Button1Click(TObject *Sender) { Label1->Caption = "1"; Application->ProcessMessages(); Delay(10000); Label1->Caption = "11"; Application->ProcessMessages(); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { Label1->Caption = "2"; Application->ProcessMessages(); Sleep(10000); Label1->Caption = "22"; Application->ProcessMessages(); } |
blk5743
高階會員 發表:34 回覆:371 積分:236 註冊:2003-11-17 發送簡訊給我 |
你可以用Help查Sleep的用法
The Sleep function suspends the execution of the current thread for a specified interval.
因為Sleep暫停了Thread一段時間,自然就不會佔CPU資源。
而用while則會造成程式一直執行,完全沒停下來的機會,CPU自然把所有資源都給你,所以CPU效能都被你拿來處理無意義的事情了。 我一個燈號都Sleep(1000)但是只會顯示最後的紅燈而以
應該是你沒加Application->ProcessMessages();吧,參考下面範例,應該可以用
void __fastcall TForm1::Timer1Timer(TObject *Sender) { Shape1->Brush->Color = clGreen; Shape2->Brush->Color = clBlack; Shape3->Brush->Color = clBlack; Shape4->Brush->Style = bsClear; //Delay(2000); Application->ProcessMessages(); Sleep(2000); Shape1->Brush->Color = clBlack; Shape2->Brush->Color = clYellow; Shape3->Brush->Color = clBlack; Shape4->Brush->Style = bsClear; //Delay(500); Application->ProcessMessages(); Sleep(500); Shape1->Brush->Color = clBlack; Shape2->Brush->Color = clBlack; Shape3->Brush->Color = clRed; Shape4->Brush->Style = bsClear; //Delay(2000); Application->ProcessMessages(); Sleep(2000); } |
iii0628
一般會員 發表:50 回覆:46 積分:19 註冊:2005-04-04 發送簡訊給我 |
原來是這樣阿,謝謝大大我的問題解決了...
引言: 你可以用Help查Sleep的用法 The Sleep function suspends the execution of the current thread for a specified interval. 因為Sleep暫停了Thread一段時間,自然就不會佔CPU資源。 而用while則會造成程式一直執行,完全沒停下來的機會,CPU自然把所有資源都給你,所以CPU效能都被你拿來處理無意義的事情了。 我一個燈號都Sleep(1000)但是只會顯示最後的紅燈而以 應該是你沒加Application->ProcessMessages();吧,參考下面範例,應該可以用void __fastcall TForm1::Timer1Timer(TObject *Sender) { Shape1->Brush->Color = clGreen; Shape2->Brush->Color = clBlack; Shape3->Brush->Color = clBlack; Shape4->Brush->Style = bsClear; //Delay(2000); Application->ProcessMessages(); Sleep(2000); Shape1->Brush->Color = clBlack; Shape2->Brush->Color = clYellow; Shape3->Brush->Color = clBlack; Shape4->Brush->Style = bsClear; //Delay(500); Application->ProcessMessages(); Sleep(500); Shape1->Brush->Color = clBlack; Shape2->Brush->Color = clBlack; Shape3->Brush->Color = clRed; Shape4->Brush->Style = bsClear; //Delay(2000); Application->ProcessMessages(); Sleep(2000); } |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |