2011-10-21 68 views
0

我工作的這一個Visual C++應用程序,以及部分運行時,「卡住」 depackitises文件,sinjce這可能需要一段時間,我實現了一個進度條,以反映depackitisation的進展。進度地沒有調試

使用調試程序運行時可以正常工作,但是當我運行時沒有調試程序或.exe文件時,進度條始終卡在中途(儘管程序完成其功能正常),然後跳轉到100 %。

通過進度條的值是獲得正確設置,我已經發現的價值的一些打印,但由於某些原因,這是不是在視覺上體現出來。

進度條更新的代碼是

while (mpeg.GetProgress() < 99){ 
      Console::Write(this->progressBar->Value); 
      this->progressBar->Value = mpeg.GetProgress(); 
      this->progressBar->Update(); 
      Sleep(100); 
     } 

這在程序主線程中完成的。 睡眠會阻止它更新太快,否則在控制檯中無法進行此操作。

這就需要跟蹤的功能是mpeg.Depackitise(),這是在一個單獨的線程中運行,這樣的進度條可以不斷更新,有關「進步」變量的代碼是:

double Mpeg::GetProgress() { 
return Mpeg::progress; 
} 

void Mpeg::SetProgress(double prog) { 
Mpeg::progress = prog; 
} 

以下代碼位於for循環中,它通過數據包遍歷整個文件包。 'packet'變量是當前數據包,'packet_count'是文件中數據包的總數,這些都是在單獨的mpeg.Depackitise()線程中完成的。

 double Percent = 0.0; 

    Percent = ((double)packet/(double)packet_count); 
    SetProgress(Percent * 100); 

如果任何人都可以建議一些解決方案來嘗試它將受到高度讚賞,這已經讓我討厭了一段時間了。我在網上發現的一些建議表示,使用未初始化的變量可能會導致運行帶/不帶調試之間的差異,但是我找不到任何未初始化的相關變量。

+0

確保窗口的標題欄也更改爲「沒有響應」?當你的UI線程死亡時,這是Windows放置的幽靈窗口。不要阻止用戶界面。 –

回答

3

你必須永遠,永遠,永遠阻塞UI線程。

你在你的應用程序,這意味着它無法應答消息泵和繪製控件/更新圖紙在屏幕上的主線程做大量的計算。

你應該看看多線程和消息傳遞作爲解決你的問題。開始一個線程,在那裏做耗時的工作,使用回調來更新主線程的進度條(並且要小心直接從主線程以外的任何地方訪問UI!)。

+0

+1由於Win32的設計和消息泵的工作方式,應始終從主線程訪問它。 –

+0

所有計算都在mpeg.Depackitise()函數中完成,該函數在單獨的線程中運行。進度條更新在主線程中完成,是否應該在單獨的線程中完成? – marasmuse

+0

我不能從主線程以外的任何其他線程訪問進度條,所以我不知道如何以其他方式更新它。 – marasmuse