為什麼DoubleBuffered完全沒有改善image閃爍情況? |
尚未結案
|
雞排
一般會員 發表:16 回覆:40 積分:11 註冊:2004-03-10 發送簡訊給我 |
看了一拖拉庫的討論串 每個問問題的人只要加入下面這段就可以改善
可是對我完全無效 麻煩高手幫幫忙(圖檔SIZE都一樣大)
void __fastcall TForm1::FormCreate(TObject *Sender)
{ Form1->DoubleBuffered=true; } =====程式碼======
for(i=1;i<=tempcount;i++)
{
for(j=1;j<10;j )
{ x[j]=show[i][j];
} SHOWPIC();
Sleep(500);
} void SHOWPIC()
{ Form1->Image1->Picture->LoadFromFile(NumberPic[x[1]]);
Form1->Image1->Refresh();
Form1->Image2->Picture->LoadFromFile(NumberPic[x[2]]);
Form1->Image2->Refresh();
Form1->Image3->Picture->LoadFromFile(NumberPic[x[3]]);
Form1->Image3->Refresh();
Form1->Image4->Picture->LoadFromFile(NumberPic[x[4]]);
Form1->Image4->Refresh();
Form1->Image5->Picture->LoadFromFile(NumberPic[x[5]]);
Form1->Image5->Refresh();
Form1->Image6->Picture->LoadFromFile(NumberPic[x[6]]);
Form1->Image6->Refresh();
Form1->Image7->Picture->LoadFromFile(NumberPic[x[7]]);
Form1->Image7->Refresh();
Form1->Image8->Picture->LoadFromFile(NumberPic[x[8]]);
Form1->Image8->Refresh();
Form1->Image9->Picture->LoadFromFile(NumberPic[x[9]]);
Form1->Image9->Refresh();
} 抱歉 新手上路 我還再找能讓程式碼對齊的功能
怎麼每次貼上去 就全貼到第一行
|
geniustom
版主 發表:100 回覆:303 積分:260 註冊:2003-01-03 發送簡訊給我 |
雞排您好..我幫您修改了一下..
因為SLEEP(500)這會讓您的系統定住..所以改用DELPAY..
在DELAY中..用 Application->ProcessMessages;來把使用權交給OS..
OS就會自動更新您的圖案了..所以也不需要做Form1->Image1->Refresh();
void Delay(long lMilliSeconds){ long lStart; lStart = GetTickCount; do{ Application->ProcessMessages; }while (GetTickCount - lStart <= lMilliSeconds) } void __fastcall TForm1::FormCreate(TObject *Sender){ Form1->DoubleBuffered=true; } =====程式碼====== for(i=1;i<=tempcount;i ){ for(j=1;j<10;j ){ x[j]=show[i][j]; } SHOWPIC(); Delay(500); } void SHOWPIC(){ Form1->Image1->Picture->LoadFromFile(NumberPic[x[1]]); Form1->Image2->Picture->LoadFromFile(NumberPic[x[2]]); Form1->Image3->Picture->LoadFromFile(NumberPic[x[3]]); Form1->Image4->Picture->LoadFromFile(NumberPic[x[4]]); Form1->Image5->Picture->LoadFromFile(NumberPic[x[5]]); Form1->Image6->Picture->LoadFromFile(NumberPic[x[6]]); Form1->Image7->Picture->LoadFromFile(NumberPic[x[7]]); Form1->Image8->Picture->LoadFromFile(NumberPic[x[8]]); Form1->Image9->Picture->LoadFromFile(NumberPic[x[9]]); }GOOD LUCK |
雞排
一般會員 發表:16 回覆:40 積分:11 註冊:2004-03-10 發送簡訊給我 |
引言: 雞排您好..我幫您修改了一下.. 因為SLEEP(500)這會讓您的系統定住..所以改用DELPAY.. 在DELAY中..用 Application->ProcessMessages;來把使用權交給OS.. OS就會自動更新您的圖案了..所以也不需要做Form1->Image1->Refresh();void Delay(long lMilliSeconds){ long lStart; lStart = GetTickCount; do{ Application->ProcessMessages; }while (GetTickCount - lStart <= lMilliSeconds) }GOOD LUCK >>< face="Verdana, Arial, Helvetica"> 抱歉能不能解釋一下這個副程式 看不太懂 我以前一直以為delay是函式說 原來要自己寫阿 可是您貼的 再bcb6不能跑 我改成下面的 加了宣告和"();" 可是程式只會執行一次 就當在那 是什麼原因呢 煩請再次回答謝謝 另外 之前有想過用Timer來做 可是不太會用 而且這樣用的人也不多 難道是有什麼缺點? void Delay(long lMilliSeconds) { long lStart,GetTickCount; lStart = GetTickCount; do{ Application->ProcessMessages(); }while (GetTickCount - lStart <= lMilliSeconds); } 發表人 - 雞排 於 2004/04/20 02:56:47 |
geniustom
版主 發表:100 回覆:303 積分:260 註冊:2003-01-03 發送簡訊給我 |
1.
主要的關鍵是在..您想要每隔500MS換依次圖..但是您是使用SLEEP(500)..
SLEEP(500)的意義是讓您這支程式"睡著"500MS..換句話說..在這500MS中..
任何這支程式上的所有東西都會"睡著"..所以我想您的程式不能使用SLEEP來當作換圖的延遲.. 2.因為我是使用DELPHI的..用法跟BCB相同..所以程式是我轉錯了..抱歉(太久沒寫C了><)
以下...
void Delay(long lMilliSeconds){ long lStart; lStart = windows->GetTickCount(); 這是取得系統時間的毫秒數 do{ Application->ProcessMessages(); }while (windows->GetTickCount() - lStart <= lMilliSeconds) windows->GetTickCount() (我忘了加函式的括號..) 上面的意思是說..(假如目前的毫秒數-剛開始DELAY的毫秒數)<=您要延遲的毫秒數 就Application->ProcessMessages (把CPU使用權交給其他PROCESS)..例如..重繪您的表單.. 讓其他的程式不至於定住.. }3. BCB及DELPHI都沒有DELAY這個函式的..可是DELAY技巧卻很常用到.. 所以我都是把常用到的功能寫成一個函式庫..因為有時後..相同的功能不是每種語言都有.. 4. 還是可以用TIMER來做的..也未嘗不好..不過..TIMER做的事跟我寫的DELAY事一樣的.. 釋放CPU使用權直到ONTIMER..就啟動ONTIMER事件..您就可以把您的SHOWPIC()寫在其中 5. 您說改了之後程式會定住 原因是因為您改了long lStart,GetTickCount; 那GetTickCount永遠是0..不會變..所以您的程式永遠得不到CPU使用權.. 以上..希望對您有幫助.. GOOD LUCK |
雞排
一般會員 發表:16 回覆:40 積分:11 註冊:2004-03-10 發送簡訊給我 |
引言:感謝您再次回答 不過compiler會顯示 Undefined symbol 'windows' 直接打windows-> 會顯示 Unable to invoke Code Completion due to errors in source code 可能又要麻煩您了 T_Tvoid Delay(long lMilliSeconds){ long lStart; lStart = windows->GetTickCount(); [red]這是取得系統時間的毫秒數 do{ Application->ProcessMessages(); }while (windows->GetTickCount() - lStart <= lMilliSeconds) } |
geniustom
版主 發表:100 回覆:303 積分:260 註冊:2003-01-03 發送簡訊給我 |
雞排您好..
我想是DELPHI與BCB不能通用
不好意思讓您試那麼多次..所以我乾脆 >
< class="code">
.h
void __fastcall Delay(DWORD Msecs);
.cpp
void __fastcall TForm1::Delay(DWORD Msecs)
{
DWORD BeginTime = GetTickCount();
do {
Application->ProcessMessages();
} while ((GetTickCount() - BeginTime) < Msecs);
}
來源..http://delphi.ktop.com.tw/topic.php?topic_id=47697
另外還有一點要注意..
就是..您的DoubleBuffered=true;
假如您的image是擺在form中..設form1->DoubleBuffered=true;
image是擺在form中..設form->DoubleBuffered=true;
若是擺在panel中..則要設panel->DoubleBuffered=true;
good luck
|
雞排
一般會員 發表:16 回覆:40 積分:11 註冊:2004-03-10 發送簡訊給我 |
引言: 雞排您好.. 我想是DELPHI與BCB不能通用 不好意思讓您試那麼多次..所以我乾脆 > < class="code"> .h void __fastcall Delay(DWORD Msecs); .cpp void __fastcall TForm1::Delay(DWORD Msecs) { DWORD BeginTime = GetTickCount(); do { Application->ProcessMessages(); } while ((GetTickCount() - BeginTime) < Msecs); } 來源..http://delphi.ktop.com.tw/topic.php?topic_id=47697 另外還有一點要注意.. 就是..您的DoubleBuffered=true; 假如您的image是擺在form中..設form1->DoubleBuffered=true; image是擺在form中..設form->DoubleBuffered=true; 若是擺在panel中..則要設panel->DoubleBuffered=true; good luck 那個討論串之前有拜讀過 竟然沒想到 謝謝提供 不過 我在程式裡用 >>< face="Verdana, Arial, Helvetica"> |
geniustom
版主 發表:100 回覆:303 積分:260 註冊:2003-01-03 發送簡訊給我 |
|
雞排
一般會員 發表:16 回覆:40 積分:11 註冊:2004-03-10 發送簡訊給我 |
|
geniustom
版主 發表:100 回覆:303 積分:260 註冊:2003-01-03 發送簡訊給我 |
|
雞排
一般會員 發表:16 回覆:40 積分:11 註冊:2004-03-10 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |