【发布时间】:2011-09-21 01:38:32
【问题描述】:
我想使用一个线程来做一些当我点击一个名为 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);
WM_FINISHED_FETCH 下的代码永远不会触发。
【问题讨论】:
-
重新更新:PostThreadMessage 是个坏主意。这需要在主消息循环中进行处理,因为它是在没有目标窗口句柄的情况下发布的。您应该调用 PostMessage 并传递目标的窗口句柄。
标签: c multithreading winapi waitforsingleobject