2013-10-08 65 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