我创建与对话的返回值发送给对话框做模式:从线程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