簡體   English   中英

C ++在新線程中創建一個窗口

[英]c++ creating a window in a new thread

我有一個基本的窗口程序,問題是當消息循環已經開始后,當我嘗試在新線程中創建窗口時,窗口顯示一秒鍾,然后消失。 沒有人沒有理由嗎? 可以在單獨的線程中創建窗口嗎?

     int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 
        {
           ::hInstance =hInstance; // initialize global variables
           ::nCmdShow =nCmdShow; 

            // start thread
            HANDLE threadHandle = startThread(StartUp); 

            MSG msg;
            while(GetMessage(&msg, 0, 0, 0)) 
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg); 
            }
            ::CloseHandle(threadHandle);

            return static_cast<int>(msg.wParam);
        }

        DWORD WINAPI StartUp(LPVOID lpParam) // new thread runs here
        {
             //code to create a new window... 

        }

我到目前為止發現的是,如果當前線程所在的窗口中沒有窗口,則GetMessage(&msg, 0, 0, 0)返回false ...有沒有辦法解決這個問題?

如果沒有窗口,則GetMessage()不會返回FALSE。 它僅在調用線程的消息隊列中尋找消息。 您要為其hWnd參數指定NULL ,因此無論消息是通過PostMessage()到窗口還是通過PostThreadMessage()到線程的ID,它都不會關心消息如何排隊。

每個線程都有自己的本地消息隊列,因此需要自己的消息循環。 在主線程開始其消息循環之后,您當然可以在工作線程中創建一個新窗口。 它們彼此獨立。 因此,您在主線程中遇到的任何問題都與在工作線程中創建窗口無關。 發生了其他事情。

這樣說來,請記住, GetMessage()返回一個BOOL ,它實際上是一個int ,而不是真正的bool GetMessage()可以返回3個不同的返回值之一:

  1. 如果發生錯誤則為-1
  2. 如果檢索到WM_QUIT消息,則為0
  3. > 0(如果檢索到任何其他消息)

您只檢查0和!= 0,所以如果GetMessage()在錯誤時返回-1,則將其視為成功而不是失敗。 甚至MSDN也說不要這樣做:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms644936.aspx

由於返回值可以為非零,零或-1,因此請避免使用以下代碼:

 while (GetMessage( lpMsg, hWnd, 0, 0)) ... 

返回值-1的可能性意味着這種代碼可能導致致命的應用程序錯誤。 而是使用如下代碼:

 BOOL bRet; while( (bRet = GetMessage( &msg, hWnd, 0, 0 )) != 0) { if (bRet == -1) { // handle the error and possibly exit } else { TranslateMessage(&msg); DispatchMessage(&msg); } } 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM