我創建與對話的返回值發送給對話框做模式:從線程MFC
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);
}
我不知道我是什麼做錯了。任何解決方案
我只是將窗口句柄傳遞給線程,然後讓線程PostMessage將WM_COMMAND IDCANCEL線程處理完畢,以便窗口處理僅在主消息隊列中處理。 – mark
可以發表一些示例代碼? – Klasik
現在我仔細看看你的代碼......看起來你沒有發送任何AfxBeginThread pParam參數......把hWnd放在那裏。另外,在你的例子中,線程立即結束......它有可能在窗口完全創建之前結束。 PostMessage(hWnd,WM_COMMAND,IDCANCEL,0); – mark