2017-07-09 36 views
-1

當我的Win32應用程序啓動時,LoadDB()應該執行,它需要至少10秒或20秒。在哪裏執行LoadDB(),作爲後臺加載任務,爲了防止GUI窗口無響應?後臺作業啓動一個Windows GUI應用程序

是否有可能做到這一點,但無需創建一個單獨的thread? (這看起來很複雜,我想避免這種情況)。


注:如果我這樣做是在主消息循環:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch (message) 
    { 
     case WM_CREATE: 
      LoadDB(); 
      ... 

的圖形用戶界面將是不響應。

+0

「這看起來很複雜」 - 做複雜的事情很複雜。 –

+0

產生一個線程,並把你的例程。 – Ron

+0

@NeilButterworth我可以做*如果需要*,但我想說「沒有其他方法嗎?」。 – Basj

回答

1

創建一個線程真的不是,因爲它可能最初看起來幾乎一樣複雜。

當你需要支持線程之間的互動,事情可能是相當複雜 - 但在這種情況下,所有你需要的是開始做,後來得到,它的工作的通知。而已。

因此,你想要做的是寫一個調用loadDB()的小函數,然後(例如)調用PostMessage讓應用程序的其餘部分知道數據庫已加載並可以使用。

真的沒有太多比它。說真的,這並不複雜也不復雜。

+0

謝謝@JerryCoffin。在加載完成後,MainThread是否可以在LoadDB()期間通過Thread2加載'std :: vector ? – Basj

+1

@Basj:如果你想要訪問它,你需要確保它是可訪問的。如果(例如)它是一個全局變量,那麼是可以訪問的。如果它是動態分配的,則需要將其地址傳回給代碼的其餘部分,以便讓它們知道它的位置。但最終,線程都共享相同的地址空間,因此您在一個線程中執行的操作很容易讓其他人看到。 –

相關問題