Я хотел использовать поток, чтобы сделать что-то, что не может сразу вернуться, когда я нажимаю кнопку с именем 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;
}
После того, как я нажал кнопку 1 (ID: IDC_BUTTON1), поток пользовательского интерфейса застрял примерно на время, сколько сделал Sleep
.
если я не использую WaitForSingleObject
, exitCode
всегда возвращаю 259 (STILL_ALIVE)?
Как я могу получить возвращаемое значение thread1
, и поток пользовательского интерфейса не может зависнуть?
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
- идентификатор потока пользовательского интерфейса.
в threadProc
PostThreadMessage((DWORD)mainThreadId,WM_FINISHED_FETCH,0,0);
код под WM_FINISHED_FETCH
никогда не срабатывает.