-1

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

何が間違っているのかわかりません。解決策はありますか?

4

2 に答える 2

2

ダイアログへのポインタをスレッド プロシージャに渡すつもりだったと思います。しかし、代わりに null を渡しました:

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

次のようにする必要があります。

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

また、スレッドが終了する前にダイアログが閉じられないように、スレッドの終了とダイアログの終了を調整する必要があります。(ある種の進行状況ダイアログだと思います)。

于 2013-10-08T16:20:14.830 に答える