全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:6919
推到 Plurk!
推到 Facebook!

為什麼DoubleBuffered完全沒有改善image閃爍情況?

尚未結案
雞排
一般會員


發表:16
回覆:40
積分:11
註冊:2004-03-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-04-19 14:18:37 IP:210.68.xxx.xxx 未訂閱
看了一拖拉庫的討論串 每個問問題的人只要加入下面這段就可以改善 可是對我完全無效 麻煩高手幫幫忙(圖檔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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-04-19 22:25:58 IP:219.68.xxx.xxx 未訂閱
雞排您好..我幫您修改了一下.. 因為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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-04-20 02:46:24 IP:210.68.xxx.xxx 未訂閱
引言: 雞排您好..我幫您修改了一下.. 因為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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-04-20 05:05:15 IP:219.68.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-04-20 12:55:40 IP:210.68.xxx.xxx 未訂閱
引言:
void Delay(long lMilliSeconds){
   long lStart;
   lStart = windows->GetTickCount();  [red]這是取得系統時間的毫秒數
   do{
      Application->ProcessMessages();
   }while (windows->GetTickCount() - lStart <= lMilliSeconds)
}
感謝您再次回答 不過compiler會顯示 Undefined symbol 'windows' 直接打windows-> 會顯示 Unable to invoke Code Completion due to errors in source code 可能又要麻煩您了 T_T
geniustom
版主


發表:100
回覆:303
積分:260
註冊:2003-01-03

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-04-20 16:07:38 IP:163.26.xxx.xxx 未訂閱
雞排您好.. 我想是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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-04-20 17:50:01 IP:210.68.xxx.xxx 未訂閱
引言: 雞排您好.. 我想是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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-04-20 18:01:06 IP:163.26.xxx.xxx 未訂閱
這樣一個指令一個動作很累人呢 [
雞排
一般會員


發表:16
回覆:40
積分:11
註冊:2004-03-10

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-04-20 18:03:17 IP:210.68.xxx.xxx 未訂閱
引言: 這樣一個指令一個動作很累人呢 [>< face="Verdana, Arial, Helvetica"> 抱歉 造成您的困擾 我再努力看看
geniustom
版主


發表:100
回覆:303
積分:260
註冊:2003-01-03

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-04-20 18:05:27 IP:163.26.xxx.xxx 未訂閱
抱歉 造成您的困擾 我再努力看看    恩..加油囉
雞排
一般會員


發表:16
回覆:40
積分:11
註冊:2004-03-10

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-04-21 12:29:37 IP:210.68.xxx.xxx 未訂閱
找到原因了 那個討論串有提到用法跟sleep一樣 所以我都沒有懷疑 必須用 Form1->Delay(); 給一樣不能compiler的人參考 另外 這只是一個延遲的函數 跟閃爍的問題好像完全沒關係......
系統時間:2024-05-04 22:29:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!