1

私は基本的なウィンドウ プログラムを持っています。問題は、メッセージ ループが既に開始されてから新しいスレッドでウィンドウを作成しようとすると、ウィンドウが 1 秒間表示されて消えてしまうことです。誰もこれの理由を知りませんか?別のスレッドでウィンドウを作成できますか?

     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 を返すということです...これをラウンドする方法はありますか?

4

1 に答える 1

2

GetMessage()ウィンドウがない場合は FALSE を返しません。呼び出しスレッドのメッセージ キュー内のメッセージのみを探します。NULLそのパラメーターを指定してhWndいるので、メッセージがどのようにキューに入れられるかは気にしません。PostMessage()ウィンドウまたはPostThreadMessage()スレッドの ID によるものです。

各スレッドには独自のローカル メッセージ キューがあるため、独自のメッセージ ループが必要です。メイン スレッドがメッセージ ループを開始した後、ワーカー スレッドで新しいウィンドウを作成できることはほぼ間違いありません。それらは互いに独立しています。したがって、メイン スレッドで発生している問題は、ワーカー スレッドでのウィンドウの作成とは関係ありません。他にも何かが起こっています。

そうは言っても、実際にはtrue ではなく であるGetMessage()a を返すことに注意してください。 次の3つの異なる戻り値のいずれかを返すことができます。BOOLintboolGetMessage()

  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); 
    }
}
于 2013-06-20T00:39:09.280 に答える