none
模态窗口调用EndDialog后报错First-chance exception at 0x77823c23 in ×××.exe: 0xC0000005: Access violation writing location 0x00000014 RRS feed

  • 问题

  • 我是想设计一个登录时的初始化窗口,初始化时只显示带有进度条的窗口,主要的代码如下:

    在主程序的OnInitDialog()中加入如下代码:

    {

    //default things

    CWinThread *Syssetup=AfxBeginThread(SysSetup,this); //先创建可以关闭初始化窗口的线程

    INT_PTR nResponse = initDlg.DoModal();   //initDlg是初始化窗口的一个对象
    if (nResponse!=IDOK)
    {
    SendMessage(WM_CLOSE);
    return FALSE;
    }

    //other things

    }

    UINT SysSetup(LPVOID pParam)
    {
    Sleep(2000);      //延时使初始化窗口各项控件就绪

    MainDlg* main=(MainDlg*)pParam;

    main->initDlg.SetProcess(50,3);       //设置进度条的进度
    Sleep(2000);
    main->initDlg.SetProcess(80,6);
    Sleep(2000);
    main->initDlg.SetProcess(100,7);
    Sleep(2000);
    main->initDlg.EndDialog(IDOK);       //在线程中关闭对话框

    }

    一般情况下(就是什么事情不做看着程序运行)debug是不会报错的,但是在debug过程中,如果我去使用其他的程序,比如看网页,查看资源管理器的文件运行到EndDialog就会报错。

    但是我在main->initDlg.EndDialog(IDOK);处设置断点时看到initDlg是分配了有效地址的,但是执行到void CDialog::EndDialog(int nResult)后就报错,然后initDlg就变成0x00000000了。想请教大家这是什么问题,能不能给个解决方法?谢谢。


    • 已编辑 minizon 2012年7月6日 7:52
    2012年7月6日 7:51

答案

  • MFC类非线程安全的,请不要再线程函数中直接操作UI上的控件,改用发送自定义消息到MainDlg类关联的窗口,在该类的自定义消息消息函数中去更新控件信息。

    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    • 已标记为答案 minizon 2012年7月8日 14:18
    2012年7月6日 10:17
    版主

全部回复

  • MFC类非线程安全的,请不要再线程函数中直接操作UI上的控件,改用发送自定义消息到MainDlg类关联的窗口,在该类的自定义消息消息函数中去更新控件信息。

    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    • 已标记为答案 minizon 2012年7月8日 14:18
    2012年7月6日 10:17
    版主
  • 我改成了按消息的方式完成控件的更新和窗口的关闭,简单试了下没有报错。不知道具体的原因是什么,在线程中操作控件很危险吗?
    2012年7月8日 14:18
  • 关于这样做的危险性参考http://support.microsoft.com/kb/147578


    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP

    2012年7月8日 23:44
    版主
  • 非常感谢!
    2012年7月9日 12:17