我想使用一個線程做一些事情,不能立即返回,當我點擊一個名爲Button1的 這裏按鈕是我的代碼:Ç得到線程功能和UI線程的返回值stucked
LRESULT CALLBACK DlgProc(HWND hWndDlg, UINT Msg, WPARAM wParam, LPARAM lParam)
{
switch(Msg)
{
case WM_INITDIALOG:
//do something.......
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDC_BUTTON1:
{
HANDLE thread1;
DWORD exitCode;
DWORD thread1ID;
thread1 = CreateThread(NULL,0,threadProc,(LPVOID)2,0,&thread1ID);
WaitForSingleObject(thread1,INFINITE);
GetExitCodeThread(thread1,&exitCode);
}
return TRUE;
}
return TRUE;
//other code..................
}
//return DefWindowProc (hWndDlg, Msg, wParam, lParam) ;
return FALSE;
}
thread1
原型:
DWORD WINAPI thread1(LPVOID n)
{
Sleep((DWORD)n*1000*2);
return (DWORD)n * 10;
}
後,我單擊button(ID:IDC_BUTTON1),UI線程大約多久Sleep
做的量stucked的。 如果我不使用WaitForSingleObject
,exitCode
總是返回259(STILL_ALIVE)?
我該怎麼做才能得到thread1
的返回值,並且UI線程無法被打斷?
EDIT
使用PostThreadMessage
:
case IDC_BUTTON1:
{
HANDLE thread1;
DWORD exitCode;
DWORD thread1ID;
DWORD mainThreadId = GetCurrentThreadId();
thread1 = CreateThread(NULL,0,threadProc,(LPVOID)mainThreadId,0,&thread1ID);
}
return TRUE;
和在DlgProc
一個新的消息:
case WM_FINISHED_FETCH:
MessageBox(NULL,NULL,NULL,MB_OK);
return TRUE;
mainThreadId
是UI線程ID。
在threadProc
PostThreadMessage((DWORD)mainThreadId,WM_FINISHED_FETCH,0,0);
代碼下WM_FINISHED_FETCH
從未被觸發。
重新更新:PostThreadMessage是一個壞主意。這需要在主消息循環中進行處理,因爲它在沒有目標窗口句柄的情況下發布。您應該調用PostMessage並傳遞目標的窗口句柄。 –