線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1696
推到 Plurk!
推到 Facebook!

ProgressBar使用問題…

答題得分者是:aftcast
ychch0819
一般會員


發表:25
回覆:29
積分:15
註冊:2006-08-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-05-04 16:41:55 IP:219.87.xxx.xxx 訂閱
 目前使用 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
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-05-04 16:59:00 IP:210.64.xxx.xxx 訂閱
整個邏輯程序有點不太正確。

個人覺得正確的解法是
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-05-04 17:36:42 IP:219.87.xxx.xxx 訂閱
謝謝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( )…
感謝…


系統時間:2017-12-13 21:12:32
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!