【问题标题】:c get the return value of thread function & UI thread stuckedc 获取线程函数的返回值&UI线程卡住
【发布时间】:2011-09-21 01:38:32
【问题描述】:

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

WM_FINISHED_FETCH 下的代码永远不会触发。

【问题讨论】:

  • 重新更新:PostThreadMessage 是个坏主意。这需要在主消息循环中进行处理,因为它是在没有目标窗口句柄的情况下发布的。您应该调用 PostMessage 并传递目标的窗口句柄。

标签: c multithreading winapi waitforsingleobject


【解决方案1】:

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

【讨论】:

  • 我知道创建一个阻塞 ui 线程的线程是没用的。所以我试图防止这种情况发生。我只想在完成后立即获得thread1 的返回值并将其发送到主线程,这样我就可以使用exitCode 进行下一步。你能给我一些示例代码吗?
  • 没有示例代码,研究 PostThreadMessage 以便您的执行线程可以告诉 ui 线程对其结果执行某些操作。
  • PostThreadMessage 可能有一些奇怪的行为。例如,如果您的 UI 代码恰好位于具有自己的消息泵的模式对话框中(例如,像 MessageBox 那样),您可能无法处理该消息。在 hwnd 上使用 PostMessage(即使是用于仅消息目的的不可见 hwnd)更可靠。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多