請問...寫一個最佳化的問題.(使用do..while迴圈)..要怎摸將過程show出來!! |
尚未結案
|
Kioarena
一般會員 發表:3 回覆:12 積分:3 註冊:2005-03-02 發送簡訊給我 |
|
blk5743
高階會員 發表:34 回覆:371 積分:236 註冊:2003-11-17 發送簡訊給我 |
|
Kioarena
一般會員 發表:3 回覆:12 積分:3 註冊:2005-03-02 發送簡訊給我 |
|
blk5743
高階會員 發表:34 回覆:371 積分:236 註冊:2003-11-17 發送簡訊給我 |
引言: 那在請問一下,為啥摸我將Timer元件開啟之後, 整個程式就跑不停。我顯現的東西就一直沒停過, 也沒有辦法在我設定的規則下停止, 是我還需要加上啥摸東西,還是我的code有寫錯呢? 謝謝!!顯示的東西一直沒停過??我不是很了解你的意思 不過你在while迴圈中作一些事,Timer裡頭發生的是可能沒有傳入 建議你在迴圈中加入Application->ProcessMessages() 這一行能讓你接受其他元件的訊息,你在Timer所做的事就會有影響了 如果還不行,再把你有問題的CODE傳上來吧 |
Kioarena
一般會員 發表:3 回覆:12 積分:3 註冊:2005-03-02 發送簡訊給我 |
gbest=0; iter=0 ; firsttime=1; finish=0; BYTE Cnt = 0; do { iter ; //----------calculate fitness value---------// for(int a=0;a我發現還是無法每隔100個iter就停止顯現一次, 感覺都是將整個程式跑完又再繼續run。 不曉得哪邊出現錯誤,麻煩大大指教一下。 非常感謝!! |
blk5743
高階會員 發表:34 回覆:371 積分:236 註冊:2003-11-17 發送簡訊給我 |
Application->ProcessMessages(); Cnt ; if ( Cnt == 100 ) { Cnt = 0;//歸零 Edit13->Text=IntToStr(iter); Edit10->Text=FloatToStr(pbestp[gbest][0]); Edit11->Text=FloatToStr(pbestp[gbest][1]); Edit12->Text=FloatToStr(minval); }改成 Cnt ; if ( Cnt == 100 ) { Cnt = 0;//歸零 Edit13->Text=IntToStr(iter); Edit10->Text=FloatToStr(pbestp[gbest][0]); Edit11->Text=FloatToStr(pbestp[gbest][1]); Edit12->Text=FloatToStr(minval); Application->ProcessMessages();//接收改變VCL }以上的方式,你試一下吧 另外,要先用中斷點確認有進入if ( Cnt == 100 )的判斷式中喔 |
blk5743
高階會員 發表:34 回覆:371 積分:236 註冊:2003-11-17 發送簡訊給我 |
|
Kioarena
一般會員 發表:3 回覆:12 積分:3 註冊:2005-03-02 發送簡訊給我 |
|
blk5743
高階會員 發表:34 回覆:371 積分:236 註冊:2003-11-17 發送簡訊給我 |
引言: 我試過之後發現, 程式都是100的倍數會顯現出來,因為Cnt == 100才顯現 不過不是照著100->200->300...的順序, 而是亂跳,可能一開始就顯現900->200->1100->100...之類的順序, 最終也沒停下來,一直run下去。因為你的值亂跳 不知道是否存在啥摸問題? 感謝大大的指教!!我想,你這個問題要用中斷點慢慢trace(手動) 或是用 建立一個Edit15(自動) Edit15->Text=IntToStr(iter); Application->ProcessMessages(); Sleep(100); 每做完一個迴圈,顯示iter的值,並停留0.1秒看你的iter在每一次回圈時的變化 理論上,你的iter應該要每次加1才對,如果不是的話 那就是你在別的地方干擾到了(你把iter設成全域變數,並被改變了) |
Kioarena
一般會員 發表:3 回覆:12 積分:3 註冊:2005-03-02 發送簡訊給我 |
|
blk5743
高階會員 發表:34 回覆:371 積分:236 註冊:2003-11-17 發送簡訊給我 |
|
Kioarena
一般會員 發表:3 回覆:12 積分:3 註冊:2005-03-02 發送簡訊給我 |
int iter,gbest,firsttime,finish; int a; double minval; gbest=0; iter=0 ; firsttime=1; finish=0; BYTE Cnt = 0; do { iter ; Edit14->Text=IntToStr(iter); Application->ProcessMessages(); Sleep(100); //----------calculate fitness value---------// for(int a=0;a這就是我寫在Timer裡面的code.. 按照這個code去run,就會出現iter只會跑到9 or 10就從頭開始從跑。 如果加上Timer1->Enabled=false;就很順的會一直跑下去。 |
blk5743
高階會員 發表:34 回覆:371 積分:236 註冊:2003-11-17 發送簡訊給我 |
那就對了,你不應該把段程式碼寫在Timer中
或是說一進入Timer就要Timer->Enabled = false
做完之後再Timer->Enabled = true 原因是Timer會一直被執行
當你做到iter =9 or 10時
又引發一次事件
iter又會從0開始做了 你可以做一個小實驗如下
int i = 0; void __fastcall TForm1::Timer1Timer(TObject *Sender) { i = 0;;//試試看第一次加這行,第二次不要加有什麼不同 do { Edit1->Text = i ; Application->ProcessMessages(); Sleep(200); }while(i<1000); } |
Kioarena
一般會員 發表:3 回覆:12 積分:3 註冊:2005-03-02 發送簡訊給我 |
|
blk5743
高階會員 發表:34 回覆:371 積分:236 註冊:2003-11-17 發送簡訊給我 |
|
Kioarena
一般會員 發表:3 回覆:12 積分:3 註冊:2005-03-02 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |