0

我想使用一个线程来做一些当我单击一个名为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)?

如何获取thread1UI 线程的返回值不能被卡住?

编辑

使用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永远不会触发的代码。

4

1 回答 1

1

如果要阻止ui线程等待它,那么创建线程有什么意义?如果您需要在其他线程完成后在 ui 线程上执行某些操作,请考虑向 ui 线程发布私人消息。见PostThreadMessage

于 2011-09-21T01:55:57.330 回答