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;
}

ボタン 1 (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;

mainThreadIdUI スレッド 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 に答える