在debug下编译运行一切正常,在release下编译通过,但运行时
出现'0x00406900'指令引用的‘0x000054'内存,该内存不能为’read'
我改变编译条件/Gz ,编译时出现
error C2665: 'AfxBeginThread' : none of the 2 overloads can convert parameter 1 from type 'unsigned int (__stdcall *)(void *)'UINT ThreadChange(LPVOID lPar)dlgpara.hWnd=GetSafeHwnd();
AfxBeginThread(ThreadChange, &dlgpara); 程序运行时的错误也正是调用线程时出的错。
请高手指点迷津。多谢了!

解决方案 »

  1.   

    第二个参数可以设为null.
    此示例说明如何定义控制函数并从程序的其他部分使用此函数。 UINT MyThreadProc( LPVOID pParam )
    {
        CMyObject* pObject = (CMyObject*)pParam;    if (pObject == NULL ||
            !pObject->IsKindOf(RUNTIME_CLASS(CMyObject)))
        return 1;   // if pObject is not valid    // do something with 'pObject'    return 0;   // thread completed successfully
    }// inside a different function in the program
    .
    .
    .
    pNewObject = new CMyObject;
    AfxBeginThread(MyThreadProc, pNewObject);
      

  2.   

    你的线程函数是不是使用了dlgpara这个变量,那这个变量会不会是一个临时的变量。如UINT ThreadChange(LPVOID lPar)另一个函数来启动这个线程

    dlgpara.hWnd=GetSafeHwnd();
    AfxBeginThread(ThreadChange, &dlgpara);

    出了函数后,dlgpara就被释放了。但你还在线程函数中使用它,如果是这样就会错啦!!!
      

  3.   

    抱歉,我没说清楚,下面是源代码。
    DWORD gId;
    void CTestApp::OnAutoRun() 
    {
    // TODO: Add your command handler code here gId=AfxGetThread()->m_nThreadID; AfxBeginThread(ThreadAuto,&gId,
    THREAD_PRIORITY_NORMAL,0,0,NULL); return;
    }
    UINT ThreadAuto(LPVOID lParam)
    {
    DWORD * id=(DWORD *)lParam; Sleep(2000);
    PostThreadMessage(*id,WM_OPEN,1,0);
    Sleep(1000);
    PostThreadMessage(*id,WM_OPEN,2,0);
    Sleep(1000);
    PostThreadMessage(*id,WM_OPEN,3,0);
    Sleep(1000);
    return 0;}void CTestApp::OnWMOpen(WPARAM  i)     //(WM_OPEN消息函数)
    {
    gIndex=i;
    OnFileNew();
    }