CSDN上的大哥们,诚心向你们求教一个问题。我用VC++ 6.0 MFC开发了一套程序 会自动长时间执行,但是每次执行的时间长了之后 就会报错,由于代码写得挺乱也很长,不好发,我大概描述一下。由于错误是需要等待执行很长时间才会出来,我不知道该怎么才能得到出错的原因。求教我用到了以下几个类:
CInternetSession(用完释放了)
ADO连接SQL SERVER (RS对象建的比较多。。但用完都释放了)
CStdioFile (用完释放了)
多线程(实际只用了一个线程)我的程序是用FOR循环几万次,使程序反复执行的。我不知道是什么原因导致 程序在运行几十分钟 到几个小时 就会报错,操作系统: windows 2003错误提示: This application has requested the Runtime to terminate it in an unusual way

解决方案 »

  1.   

    把dump文件弄出来,放到与PDB文件同一目录下,用VC调试。
      

  2.   


    请问具体如何操作?没用过 dump()
      

  3.   

    只能说MFC是非线程安全的,给线程传递对象的时候不要将MFC类的指针传递给它,而是要将句柄传递过去。
      

  4.   

    线程我是这样做的void CExam8Dlg::OnStartthreadButton() 
    {
    //HANDLE hand=CreateThread(NULL,0,ThreadProc,NULL,0,NULL);
    HANDLE hand=CreateThread(NULL,0,ThreadProc,this,0,NULL);}DWORD WINAPI ThreadProc(LPVOID lpParameter)
    {// OnSaveKeywordButton() ;
    CExam8Dlg *pDlg = (CExam8Dlg*)lpParameter;
    pDlg->OnSaveKeywordButton() ; return 0;
    }有问题吗?
      

  5.   

    用MFC的必须用AfxBeginThread,用crt的必须用beginthreadex,不要用Windows API CreateThread否则你死定了。因为它们都需要初始化自己的资源,MFC的AfxBeginThread要初始化MFC资源和crt资源,crt的要初始化crt资源,最后它们都会调用Windows CreateThread。
      

  6.   

    都说过了MFC是非线程安全的,不要把MFC类的指针传作为参数递给线程
    void CExam8Dlg::OnStartthreadButton()
    {
     AfxBeginThread(ThreadProc, (LPVOID)GetSafeHwnd());
    }UINT _cdecl ThreadProc(LPVOID lParam)
    {
     HWND hWnd = (HWND)lParam;
     ASSERT(hWnd);
     ::SendMessage(hWnd, UM_MESSAGE, 0, 0);
     return 0;
    }afx_msg LRESULT OnMessage(WPARAM wParam, LPARAM lParam);
    #define UM_MESSAGE WM_USER+11BEGIN_MESSAGE_MAP(CExam8Dlg, CDialog)
    ...
    ON_MESSAGE(UM_MESSAGE, &CExam8Dlg::OnMessage)
    END_MESSAGE_MAP()LRESULT CExam8Dlg::OnMesage(WPARAM wParam, LPARAM lParam)
    {
     OnSaveKeywordButton();
     return 0;
    }
      

  7.   

    这都是老生常谈了,千万不要用createthread,无论在哪里,你都必须确保窗口不被跨线程使用
    http://blog.vckbase.com/arong/archive/2009/05/17/15578.html
      

  8.   

    楼上的不是都已经说了么,CreatThread()不能用,用AfxBeginThread,或 beginthreadex代替
      

  9.   

    我的程序如何改成 AfxBeginThread的?