我的應用程序可能需要一段時間才能連接到數據庫。這個連接是通過一個庫函數調用完成的,也就是說,我不能在那裏放置進度更新並進行回調或類似的事情。如何在單獨的線程中使用進度條創建MFC對話框?
我的想法是在連接到數據庫之前,在單獨的線程中創建一個帶有進度條的對話框。此對話框將不斷更改CProgressCtrl::StepIt()
的進度狀態,以便用戶看到發生的事情。
之後,對話框設置和做它的事情我想從主線程調用數據庫連接功能。 連接功能完成後,我想停止進度條線程。
讓我畫一幅畫:
CMyApp:: ProgressThread
InitInstance() .
| .
| .
+-Create Dialog-+
| |
| Animate
Connect Progress
to Bar
DB |
| |
+-Destroy Dlg---+
| .
| .
這可能嗎?如果是,如何?
也許整個事情也會使用定時器。可能會簡單得多,但我也無法讓它工作。
- 我知道
CProgressCtrl::SetMarquee()
這可能正是我所需要的,但我不能使用它,因爲應用程序沒有Unicode支持。 - 我可以將db連接調用移動到一個單獨的線程中,但這樣看起來好像對代碼進行了很多更改並且額外處理了連接錯誤。
更新2
我得到它的工作AlexEzh和哈維爾·佩德羅·德建議的方式:把DB塞入到它自己的線程。
最初我擔心錯誤處理是如何完成的,但實際上它與以前的方式非常相似。
- 在主線程中,我使用連接參數,結果標誌和線程運行標誌創建了一個結構。後者最初設置爲
true
。 - 我創建一個線程並將該結構作爲參數傳遞。
- 我創建一個對話框,在主線程中顯示進度條。
- 另外在主線程中有一個循環,它在設置線程運行標誌時運行。它調用
CMyDialog::Animate()
,它調用CProgressCtrl::StepIt()
,然後Sleep()
有點。 - 線程執行db連接代碼並在完成時將運行標誌設置爲
false
。 - 當主線程退出循環時,它可以像以前一樣處理錯誤。
缺點:將鼠標移到窗口上不起作用。它是隱形的。因此不能使用取消按鈕或其他交互式對話元素。不過,我可以忍受這一點。
既然你喜歡的圖,這裏是現在的樣子:
CMyApp:: WorkerThread
InitInstance() .
| .
| .
Create Dialog .
| .
+-Start Thread--+
| |
| Connect
Animate to
Progress DB
Bar |
| |
+-Thread Ends---+
| .
Destroy Dlg .
| .
+1爲圖 – 2009-11-03 19:52:12
您可以在ANSI應用程序調用SetMarquee(),但它不會幫你,因爲是動畫進度條的計時器被稱爲主線程也 – 2009-11-03 19:55:25
在我afxcmn上。h看起來像這樣: ** if(_WIN32_WINNT> = 0x0501)&& defined(UNICODE)\ n BOOL SetMarquee(_In_ BOOL fMarqueeMode,_In_ int nInterval); \ n #endif \t // _WIN32_WINNT> = 0x0501 && defined(UNICODE)\ n ** 這就是爲什麼我不能調用它。 – foraidt 2009-11-04 08:46:08