2013-10-08 66 views
-1

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

我不知道我是什么做错了。任何解决方案

+0

我只是将窗口句柄传递给线程,然后让线程PostMessage将WM_COMMAND IDCANCEL线程处理完毕,以便窗口处理仅在主消息队列中处理。 – mark

+0

可以发表一些示例代码? – Klasik

+0

现在我仔细看看你的代码......看起来你没有发送任何AfxBeginThread pParam参数......把hWnd放在那里。另外,在你的例子中,线程立即结束......它有可能在窗口完全创建之前结束。 PostMessage(hWnd,WM_COMMAND,IDCANCEL,0); – mark

回答

2

我假设你打算把指向对话框的指针传递给线程处理程序。但是传递的是null而不是:

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

应该是:

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

您还需要协调与对话结束的线程结束,以确保对话之前没有被驳回线程结束。 (我认为这是某种进步对话)。

+0

我编辑的代码通过将m_hWnd线程调用但仍然收到相同的错误。 – Klasik

+0

@klasik,如果您正在将其转换为CDialog,则需要将'this'传递给该线程。 – Ben

+0

谢谢你解决了我的问题。 – Klasik

2

这看起来是这个问题对我说:

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。然后,您取消引用空指针。

+0

我编辑的代码通过把m_hWnd线程调用 – Klasik

+0

然后编辑投到'HWND'而不是'MainHamsterDlg *'...然后使用PostMessage而不是自我> EndDialog – mark