[英]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個不同的返回值之一:
WM_QUIT
消息,則為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.