当我点击名为 button1 的按钮时,我想使用线程执行无法立即返回的操作 这是我的代码:
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;
}
单击button1(ID:IDC_BUTTON1)后,UI线程大约停留Sleep
的时间长度。
如果我不使用WaitForSingleObject
,exitCode
总是返回259(STILL_ALIVE)?
如何获取thread1
的返回值并且UI线程无法被卡住?
修改
使用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);
<{1}}下的代码永远不会触发。
答案 0 :(得分:1)
如果要阻止ui线程等待它,那么创建线程的重点是什么?如果您需要在其他线程完成后在ui线程上执行某些操作,请考虑向ui线程发送私有消息。请参阅PostThreadMessage
。