ProgressBar使用問題… |
答題得分者是:aftcast
|
ychch0819
一般會員 發表:25 回覆:29 積分:15 註冊:2006-08-09 發送簡訊給我 |
目前使用 progressbar ,遇到 progressbar 無法refresh的問題…想請教各位。
我有一隻 function 執行時,需要花上一段時間…因此想在呼叫此 function前,pop 另一個 form,上面顯示大概的進度,讓user不要以為程式當掉… 以下是Form1大致的程式碼 thd = new refresh_pgbar(false); //用來更新progress bar... thd->FreeOnTerminate=true; Form_Timer->Show(); Application->ProcessMessages(); FunctionA ( ); Form_Timer->Close(); thd->Terminate(); 以下則是 thread上的程式碼 void __fastcall refresh_pgbar::Execute() { //---- Place thread code here ---- while(1) { Synchronize(UpdateCaption); Sleep(500); } } //--------------------------------------------------------------------------- void __fastcall refresh_pgbar::UpdateCaption() { Form_Timer->ProgressBar1->Position ; Form_Timer->Refresh(); } 但是這樣 Form_Timer出來的progressbar 進度列都不會refresh... 不知道是哪邊要加上Application->ProcessMessages( )… 感謝… 編輯記錄
ychch0819 重新編輯於 2011-05-04 02:43:08, 註解 無‧
|
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
整個邏輯程序有點不太正確。
個人覺得正確的解法是 functionA()裡的程式碼應該要 併入void __fastcall refresh_pgbar::Execute() 裡面。並在適當的地方插入 Synchronize(UpdateCaption); 請注意,我說的是functionA() 裡的碼拿出來。也就是說再也沒有functionA() 這個函式。Application->ProcessMessages(); 也無需使用 若硬要套你目前的寫法 (不建議的寫法) 那就是要把Application->ProcessMessages(); 這句話 移進 functionA() 的裡面,在functionA()的實作中適當的插入數個不等的Application->ProcessMessages(),或在回圈裡加入。 ===================引 用 ychch0819 文 章=================== 目前使用 progressbar ,遇到 progressbar 無法refresh的問題…想請教各位。 我有一隻 function 執行時,需要花上一段時間…因此想在呼叫此 function前,pop 另一個 form,上面顯示大概的進度,讓user不要以為程式當掉… 以下是Form1大致的程式碼 thd = new refresh_pgbar(false); //用來更新progress bar... thd->FreeOnTerminate=true; Form_Timer->Show(); Application->ProcessMessages(); FunctionA ( ); Form_Timer->Close(); thd->Terminate(); 以下則是 thread上的程式碼 void __fastcall refresh_pgbar::Execute() { //---- Place thread code here ---- while(1) { Synchronize(UpdateCaption); Sleep(500); } } //--------------------------------------------------------------------------- void __fastcall refresh_pgbar::UpdateCaption() { Form_Timer->ProgressBar1->Position ; Form_Timer->Refresh(); } 但是這樣 Form_Timer出來的progressbar 進度列都不會refresh... 不知道是哪邊要加上Application->ProcessMessages( )… 感謝…
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
ychch0819
一般會員 發表:25 回覆:29 積分:15 註冊:2006-08-09 發送簡訊給我 |
謝謝a大的回應…
但是 functionA 裡面有用到許多 form1的global 變數…如果把整個functionA 移至 thread class裡,會有一些困難… 我可能會暫時試看看第二種方式…如果不行…在想辦法改成第一種方式… 感謝 ===================引 用 aftcast 文 章=================== 整個邏輯程序有點不太正確。 個人覺得正確的解法是 functionA()裡的程式碼應該要 併入void __fastcall refresh_pgbar::Execute() 裡面。並在適當的地方插入 Synchronize(UpdateCaption); 請注意,我說的是functionA() 裡的碼拿出來。也就是說再也沒有functionA() 這個函式。Application->ProcessMessages(); 也無需使用 若硬要套你目前的寫法 (不建議的寫法) 那就是要把Application->ProcessMessages(); 這句話 移進 functionA() 的裡面,在functionA()的實作中適當的插入數個不等的Application->ProcessMessages(),或在回圈裡加入。 ===================引 用 ychch0819 文 章=================== 目前使用 progressbar ,遇到 progressbar 無法refresh的問題…想請教各位。 我有一隻 function 執行時,需要花上一段時間…因此想在呼叫此 function前,pop 另一個 form,上面顯示大概的進度,讓user不要以為程式當掉… 以下是Form1大致的程式碼 thd = new refresh_pgbar(false); //用來更新progress bar... thd->FreeOnTerminate=true; Form_Timer->Show(); Application->ProcessMessages(); FunctionA ( ); Form_Timer->Close(); thd->Terminate(); 以下則是 thread上的程式碼 void __fastcall refresh_pgbar::Execute() { //---- Place thread code here ---- while(1) { Synchronize(UpdateCaption); Sleep(500); } } //--------------------------------------------------------------------------- void __fastcall refresh_pgbar::UpdateCaption() { Form_Timer->ProgressBar1->Position ; Form_Timer->Refresh(); } 但是這樣 Form_Timer出來的progressbar 進度列都不會refresh... 不知道是哪邊要加上Application->ProcessMessages( )… 感謝… |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |