簡體   English   中英

從線程MFC發送返回值到對話框

[英]Send return value to dialog from thread MFC

我正在用do modal創建對話框:

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

在這里, ParamNULL ,所以selfNULL 然后,您取消引用空指針。

我假設您打算將指向對話框的指針傳遞給線程proc。 但是您改為傳遞null:

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

應該:

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

您還需要使線程的末尾與對話框的末尾協調,以確保在線程結束之前不會關閉對話框。 (我認為這是某種進度對話框)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM