с получить возвращаемое значение функции потока и потока пользовательского интерфейса застрял - PullRequest
0 голосов
/ 21 сентября 2011

Я хотел использовать поток, чтобы сделать что-то, что не может сразу вернуться, когда я нажимаю кнопку с именем 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 никогда не срабатывает.

1 Ответ

1 голос
/ 21 сентября 2011

Какой смысл создавать поток, если вы собираетесь заблокировать поток пользовательского интерфейса, чтобы дождаться его? Если вам нужно что-то сделать в потоке пользовательского интерфейса после завершения другого потока, рассмотрите возможность размещения личного сообщения в потоке пользовательского интерфейса. Смотри PostThreadMessage.

...