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

關於狀態切換問題

答題得分者是:blk5743
iii0628
一般會員


發表:50
回覆:46
積分:19
註冊:2005-04-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-04-11 15:42:48 IP:220.130.xxx.xxx 未訂閱
請問我現在運作的順序是狀態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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-04-11 17:33:16 IP:61.66.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-04-12 01:03:11 IP:163.13.xxx.xxx 未訂閱
以解決,改用版上有位大大寫的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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-04-12 08:54:48 IP:210.68.xxx.xxx 未訂閱
引言:以解決,改用版上有位大大寫的DELAY副函式就OK了
用DELAY副函式可以解決狀態問題,不懂
blk5743
高階會員


發表:34
回覆:371
積分:236
註冊:2003-11-17

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-04-12 09:59:21 IP:61.66.xxx.xxx 未訂閱
我也不懂 不過既然iii0628說解決了,而且是用delay完成的 可見我的回覆可能是答非所問(不懂一) 不過我很好奇, >
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-04-12 10:09:59 IP:210.68.xxx.xxx 未訂閱
blk5743您好:  
引言:不過我很好奇,taishyang竟然會跳出來說他不懂 可見taishyang大大雖然很少回答了,還是有在關心這些Q&A 大多數是因為不會啦,我都是邊看邊學的,每天都會把版上當天的文章看過一遍,增廣見聞順便管理版面 另外有一件事不知道>那是因為很多人都 >, <>而且我覺得您已經回答他的問題了,但卻以[缺席]做結案感到納悶,且是用想不到的方式解決,所以好奇的回應一下 < face="Verdana, Arial, Helvetica"> 順心
iii0628
一般會員


發表:50
回覆:46
積分:19
註冊:2005-04-04

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-04-12 10:55:11 IP:220.130.xxx.xxx 未訂閱
應該是我表達的方式錯了,讓大家誤會。我把我的程式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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-04-12 13:56:48 IP:61.66.xxx.xxx 未訂閱
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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-04-12 21:14:12 IP:163.13.xxx.xxx 未訂閱
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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-04-13 08:47:25 IP:61.66.xxx.xxx 未訂閱
你可以用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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-04-13 11:02:20 IP:220.130.xxx.xxx 未訂閱
原來是這樣阿,謝謝大大我的問題解決了...    
引言: 你可以用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);    }    
系統時間:2024-05-19 14:19:59
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!