程序在运行一段时间后提示错误:Debugg Assertion Failed,错误是在thrdcore.cpp的第231行,即ASSERT(pThread != AfxGetApp())出错,这个错误是什么原因导致的?在线程函数里面我载入了一个dll,释放后返回。

解决方案 »

  1.   

    现在不是每次运行都会出错,而是在运行一段时间之后,线程函数被重复调用很多次之后才出错。
    另外在wincore.cpp的第991行,CWnd::DestroyWindow()也有一个错误。这两个错误都是在注掉线程函数的时候出现。线程函数里面没有涉及到窗口的操作,因为在线程函数里面载入的dll,所有代码不好发,请大家帮忙提示一下可能是什么原因。
      

  2.   

    线程函数里调用CXxxApp成员函数造成断言失败,应使用消息避免直接调用。
      

  3.   

    //用于调用信息的线程函数
    UINT ModuleFunc(LPVOID a_pThreadInfo)
    {
    STThreadInfo* pThreadInfo = (STThreadInfo*)a_pThreadInfo; ACE_Barrier* pDataCopyBarrier = pThreadInfo->m_pBarrier;
    CString sModuleName = pThreadInfo->m_sModuleName;
    UINT nMsgUserDefined = pThreadInfo->m_nMsgDefined;
    UINT nClientID = pThreadInfo->m_nClientID;
    LPVOID pClientStream = pThreadInfo->m_pStream;
    _bstr_t strCon = pThreadInfo->m_strCon;
    LPVOID SendDataFunc = pThreadInfo->m_pFunc;
    LPCSTR sDataSeries = pThreadInfo->m_pData;
    UINT nDataSeriesAmount = pThreadInfo->m_nDataLen;
    char* pDataRcvBuffer = new char[nDataSeriesAmount];
    memcpy(pDataRcvBuffer, sDataSeries, nDataSeriesAmount);

    pDataCopyBarrier->wait();
    try
    {
    //载入模块
    HINSTANCE hInst;
    hInst = LoadLibrary(sModuleName);
    typedef (*ACCEPTDATAPROC) (UINT a_nCmdID, LPCSTR a_sDataSeries, UINT a_nDataSeriesAmount, UINT a_nClientID, LPVOID a_cClientAddr,_bstr_t a_strCon, LPVOID a_SendDataFunc);
    ACCEPTDATAPROC AcceptData = (ACCEPTDATAPROC)GetProcAddress(hInst,"AcceptData");
    //调用模块函数
    if (AcceptData)
    {
    AcceptData(nMsgUserDefined, (LPCSTR)pDataRcvBuffer, nDataSeriesAmount, nClientID, pClientStream, strCon, SendDataFunc);
    }
    FreeLibrary(hInst);
    }
    catch(...)
    {
    delete[] pDataRcvBuffer;
    return 1;
    }
    delete[] pDataRcvBuffer;
    return 0;
    }
    这是线程函数
      

  4.   

    还是要检查一下出错时的dump文件等,查看一下call statck等调研堆栈,
    还可以尝试把线程中的代码搬到主线程,然后线程中发送消息等来通知主线程执行对应的代码
      

  5.   

    从如下代码片断看,你似乎在主线程内部直接或者间接调用了AfxEndThread,而这个函数只应该在从线程中调用void AFXAPI AfxEndThread(UINT nExitCode, BOOL bDelete)
    {
    #ifndef _MT
    nExitCode;
    bDelete;
    #else
    // remove current CWinThread object from memory
    AFX_MODULE_THREAD_STATE* pState = AfxGetModuleThreadState();
    CWinThread* pThread = pState->m_pCurrentWinThread;
    if (pThread != NULL)
    {
    ASSERT_VALID(pThread);
    ASSERT(pThread != AfxGetApp());
      

  6.   

    在遇到问题时,点击Retry按钮,就可以调试了,看看调用堆栈,就知道怎么进这个函数了
      

  7.   

    谢谢楼上各位帮忙。我写了一个循环来不停的创建线程,还是在线程函数里面载入dll,一段时间后AfxBeginThread的返回值为空。这是什么原因导致的?
      

  8.   

    GetLastError,你的线程创建了多少,资源耗尽了?