c得到线程函数的返回值& UI线程陷入困境

时间:2011-09-21 01:38:32

标签: c multithreading winapi waitforsingleobject

当我点击名为 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的时间长度。 如果我不使用WaitForSingleObjectexitCode总是返回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}}下的

代码永远不会触发。

1 个答案:

答案 0 :(得分:1)

如果要阻止ui线程等待它,那么创建线程的重点是什么?如果您需要在其他线程完成后在ui线程上执行某些操作,请考虑向ui线程发送私有消息。请参阅PostThreadMessage