執行.exe檔中大迴圈時 介面會暫時卡住 |
答題得分者是:harpist
|
dominicx
一般會員 發表:6 回覆:10 積分:13 註冊:2007-05-07 發送簡訊給我 |
我目前在做有關圖形處理的論文程式
因此在執行回圈的時候, 次數會相當的高, 單次的運算量也很重 小弟我直接從BCB run我的程式的時候都沒問題 但是run .exe的檔案的時候 在執行這部份回圈的地方, 會造成我的介面無法及時更新, 看似有點小當機的狀況 不過這部份回圈執行完畢後又恢復正常了 正常的模樣 dominic7125.myweb.hinet.net/normal.jpg 小當掉的樣子 dominic7125.myweb.hinet.net/crash.jpg 因為我的程式是會要上台Demo的, 所以想改善一下這個執行時, 介面會造成不美觀部份 由於程式很大, 我只擷取會造成介面delay的部份的原始碼 <textarea class="cpp" rows="10" cols="60" name="code">//============= //下列原始碼是將圖檔從資料庫當中讀出來, 然後經過轉化存放到陣列當中 //============= class DataBase{ public: AnsiString name[4804]; int TPC[4804],CC[4804],PBA[4804]; int picture[4804][50][50]; }; //============= DB = new(DataBase); TStream *pms = new TMemoryStream(); ADOTable1->First(); for(int i=0;i<4804;i ){ StatusBar1->SimpleText = "Connecting Database ...." (AnsiString)i; DB->name[i] = ADOTable1->FieldValues["char"]; DB->TPC[i] = ADOTable1->FieldValues["TPC"]; DB->CC[i] = ADOTable1->FieldValues["CC"]; DB->PBA[i] = ADOTable1->FieldValues["PBA"]; pms = new TMemoryStream(); ADOTable1picture->SaveToStream(pms); pms->Position = 0; Image1->Picture->Bitmap->LoadFromStream(pms); for(int j=0;j<50;j ){ for(int k=0;k<50;k ){ if(GetRValue(Image1->Canvas->Pixels[j][k])==0){ DB->picture[i][j][k] = 1; }else{ DB->picture[i][j][k] = 0; } } } Form1->Refresh(); delete pms; ADOTable1->Next(); } StatusBar1->SimpleText = "Database is loaded."; Clean(Image1);</textarea> 編輯記錄
dominicx 重新編輯於 2007-07-23 08:45:44, 註解 無‧
|
harpist
資深會員 發表:3 回覆:251 積分:430 註冊:2002-10-03 發送簡訊給我 |
<textarea class="cpp" rows="10" cols="60" name="code">
for(int i=0;i<4804;i )
{
StatusBar1->SimpleText = "Connecting Database ...." (AnsiString)i;
DB->name[i] = ADOTable1->FieldValues["char"];
DB->TPC[i] = ADOTable1->FieldValues["TPC"];
DB->CC[i] = ADOTable1->FieldValues["CC"];
DB->PBA[i] = ADOTable1->FieldValues["PBA"];
pms = new TMemoryStream();
ADOTable1picture->SaveToStream(pms);
pms->Position = 0;
Image1->Picture->Bitmap->LoadFromStream(pms);
for(int j=0;j<50;j )
{
for(int k=0;k<50;k )
{
if(GetRValue(Image1->Canvas->Pixels[j][k])==0)
{
DB->picture[i][j][k] = 1;
}
else
{
DB->picture[i][j][k] = 0;
}
Application->ProcessMessages(); //加這行
}
Application->ProcessMessages(); //加這行
}
Form1->Refresh();
delete pms;
ADOTable1->Next();
Application->ProcessMessages(); //加這行
}
</textarea>
在迴圈裡加Application->ProcessMessages();釋放一下資源讓系統處理一下其它的Windows Messages。
------
~§~迷時師渡,悟了自渡~§~ |
dominicx
一般會員 發表:6 回覆:10 積分:13 註冊:2007-05-07 發送簡訊給我 |
|
harpist
資深會員 發表:3 回覆:251 積分:430 註冊:2002-10-03 發送簡訊給我 |
|
daniel710624
一般會員 發表:11 回覆:13 積分:4 註冊:2003-04-11 發送簡訊給我 |
|
mypigbaby
高階會員 發表:11 回覆:168 積分:155 註冊:2006-07-20 發送簡訊給我 |
delphi的用法是
Application.ProcessMessages; ===================引 用 daniel710624 文 章=================== 不好意思,借此題請教一下,同樣的觀念, 是否也可應用在Delphi中? 是不是也可改善程式執行時,東一塊反白,西一塊反白的現像? ===================引 用 dominicx 文 章=================== 感謝~! 已解決! 另外一個小問題 Application->ProcessMessages(); 這個method會影響效能嗎? |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |