C++ 从线程MFC向对话框发送返回值

C++ 从线程MFC向对话框发送返回值,c++,multithreading,mfc,C++,Multithreading,Mfc,我正在使用do模式创建对话框: MainHamsterDlg MainHamsterDlg; if (MainHamsterDlg.DoModal() == IDCANCEL) break; 然后在该对话框中创建工作线程: BOOL MainHamsterDlg::OnInitDialog() { AfxBeginThread(WorkerThreadProc, m_hWnd, THREAD_PRIORITY_NORMAL, 0, 0, NULL);

我正在使用do模式创建对话框:

MainHamsterDlg MainHamsterDlg;
 if (MainHamsterDlg.DoModal() == IDCANCEL)
 break;
然后在该对话框中创建工作线程:

BOOL MainHamsterDlg::OnInitDialog()
    {
        AfxBeginThread(WorkerThreadProc, m_hWnd, THREAD_PRIORITY_NORMAL, 0, 0, NULL);
        CDialogEx::OnInitDialog();

        return TRUE;
    }
线程必须通过发送返回值IDCANCEL退出对话框

    UINT WorkerThreadProc(LPVOID Param) //Sample function for using in AfxBeginThread
    {
        Sleep(1000); // process simulation
        MainHamsterDlg * self = (MainHamsterDlg *)Param;
        self->EndDialog(IDCANCEL);
        return FALSE;
    }
编译时,我没有得到任何错误。处理时,然后抓住要点:

self->EndDialog(IDCANCEL);
错误消息:

Unhandled exception at 0x01503AD4 in L2Hamster.exe: 0xC0000005:
Access violation reading location 0x00000020.
指向dlgcore.cpp文件的文件:

void CDialog::EndDialog(int nResult)
{
    ASSERT(::IsWindow(m_hWnd)); <<<<<===== to that line

    m_bClosedByEndDialog = TRUE;

    if (m_nFlags & (WF_MODALLOOP|WF_CONTINUEMODAL))
        EndModalLoop(nResult);

    ::EndDialog(m_hWnd, nResult);
}

我不知道我做错了什么。有什么解决办法吗?

这似乎是我的问题:

AfxBeginThread(WorkerThreadProc, NULL, THREAD_PRIORITY_NORMAL, 0, 0, NULL);

UINT WorkerThreadProc(LPVOID Param) //Sample function for using in AfxBeginThread
{
    MainHamsterDlg * self = (MainHamsterDlg *)Param;
        self->EndDialog(IDCANCEL);
    ...
}

这里,Param为NULL,因此self为NULL。然后取消对空指针的引用。

我假设您打算将指向对话框的指针传递给线程进程。但您传递的却是null:

 AfxBeginThread(WorkerThreadProc, NULL, THREAD_PRIORITY_NORMAL, 0, 0, NULL);
应该是:

 AfxBeginThread(WorkerThreadProc, this, THREAD_PRIORITY_NORMAL, 0, 0, NULL);

您还需要将线程的结尾与对话框的结尾进行协调,以确保在线程结束之前不会取消对话框。我假设它是某种进度对话框。

我只将窗口句柄传递给线程,然后让线程在完成后将WM_命令IDCANCEL传递给该句柄,以便窗口处理仅在主消息队列上处理。您可以发布一些示例代码吗?现在我仔细看一下您的代码。。。在AfxBeginThread pParam参数中似乎没有发送任何内容。。。把hWnd放在那里。另外,在您的示例中,线程立即结束。。。您的线程可能在窗口完全创建之前结束。PostMessage hWnd,WM_命令,IDCANCEL,0;我编辑了一些代码,你能再看一遍吗?PostMessage hWnd,WM_命令,IDCANCEL,0;如何发送到线程hWndUINT WorkerThreadProcLPVOID参数{Sleep1000;PostMessage HWNDParam,WM_命令,IDCANCEL,0;return FALSE;}我通过将m_hWnd放入线程调用来编辑代码,但仍然得到相同的错误。@klasik,如果要转换为CDialog,则需要将其传递给线程。然后编辑以转换为HWND而不是MainHamsterDlg*。。。然后使用PostMessage而不是self->EndDialog