从线程 MFC 将返回值发送到对话框

Send return value to dialog from thread MFC

本文关键字:对话框 返回值 线程 MFC      更新时间:2023-10-16

我正在用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);

应该是:

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

您还需要协调线程的末尾和对话框的结尾,以确保在线程结束之前不会关闭对话框。(我假设这是某种进度对话框(。

对我来说似乎是问题所在:

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

在这里,ParamNULL,所以selfNULL。 然后取消引用空指针。