我在主程序中创建一个线程m_hDeviceLoopThread,想在线程的回调函数DeviceLoopCallBack中,
创建一个无模式对话框,运行出现访问错误!
创建线程的函数
BOOL CMainFrame::CreateDeviceLoopThread()
{
m_hDeviceLoopThread=(HANDLE)_beginthreadex(NULL,
NULL,
(PTHREAD)DeviceLoopCallBack,
this,
CREATE_SUSPENDED,
&m_dwDeviceLoopThreadID); if(m_hDeviceLoopThread!=NULL)
{
ResumeThread(m_hDeviceLoopThread);
}
}
回调函数
DWORD CMainFrame::DeviceLoopCallBack(LPVOID lpThreadParameter)
{
CMainFrame *pMain=(CMainFrame *)lpThreadParameter;         //m_PlatControlDlg为一个对话框成员对象
pMain->m_PlatControlDlg.Create(IDD_PLAT_CONTROL_DLG,NULL); return 1;
}
什么原因?请高手指点

解决方案 »

  1.   

    我记得好像CWnd里的一些成员不是线程安全的,就得CWnd::FromHandle,如果不在创建线程中调用,就会出错,你这个可能也是这类问题,你可以考虑在DeviceLoopCallback里再向主窗口发一个消息,然后主窗口的消息处理里来创建对话框
      

  2.   

    楼上说的有道理往主窗口发消息这个方法我试过了,是可以的!在主窗口的消息处理函数中可以创建对话框我还试过一种方式在主窗口中定义一个函数OnCreateDlg()在这个函数中创建对话框然后在回调函数DeviceLoopCallBack调用这个函数,但这么做也是出错,要求终止程序!DWORD CMainFrame::DeviceLoopCallBack(LPVOID lpThreadParameter)
    {
           CMainFrame *pMain=(CMainFrame *)lpThreadParameter;
             pMain->OnCreateThread();return 1;
    }
      

  3.   

    程序中又遇到这个问题
    这次是创建的线程中调用创建CMSComm对象DWORD CMainFrame::DeviceLoopCallBack(LPVOID lpThreadParameter)
    {
    ……
    CMSComm m_com; if(!m_com.Create(NULL,style,CRect(0,0,0,0),this,IDC_MSCOMM))
    {
    TRACE0("Failed to create OLE Communication Control!\n");
    return 0;
    }……return 1;
    }
    出错的部分就这样运行后要求关闭窗体什么原因