本帖最后由 VisualEleven 于 2013-05-31 14:46:41 编辑

解决方案 »

  1.   

    出错的时候直接打开编译器,然后查看函数的callstack
      

  2.   

    看了的 没有东西,程序 主线程 和 watch线程还在运行中 但是 worker线程 停了。
      

  3.   

    看看你work线程函数的参数是否在运行期间有效?
      

  4.   

    _write(int 1, const void * 0x00000000, unsigned int 4084208) line 155 + 3 bytes
    _flush(_iobuf * 0x00433df8) line 162 + 23 bytes
    _ftbuf(int 0, _iobuf * 0x00433df8) line 194 + 9 bytes
    printf(const char * 0x00430228 `string') line 62 + 14 bytes
    CSocketInterface::_WatchThread(void * 0x0012ff38) line 179 + 10 bytes
    KERNEL32! 7c80b729()这是程序蹦溃时的堆栈情况 printf里面出错了。。 这个printf文句如下:
    printf("WatchTreaad is Working ....\n");这是什么个情况啊 ~!!
      

  5.   

    回复:VisualEleven 
    版主大大,我看了一下,应该是有效的,我在使用前进行了判断 也没有失效过。
      

  6.   

    错误如下:
    ---------------------------
    Microsoft Visual C++
    ---------------------------
    Unhandled exception in newTread.exe: 0xC0000005: Access Violation.
    ---------------------------
    确定   
    ---------------------------堆栈如下:
    write_char(int 100, _iobuf * 0x00433df8, int * 0x0083fcbc) line 1083 + 32 bytes
    _output(_iobuf * 0x00433df8, const char * 0x00430233, char * 0x0083ff20) line 393 + 21 bytes
    printf(const char * 0x00430228 `string') line 60 + 18 bytes
    CSocketInterface::_WatchThread(void * 0x0012ff38) line 179 + 10 bytes
    KERNEL32! 7c80b729()
      

  7.   

    弹出错误:
    ---------------------------
    Microsoft Visual C++ Debug Library
    ---------------------------
    Debug Assertion Failed!Program: D:\newTread\Debug\newTread.exe
    File: dbgheap.c
    Line: 1076Expression: _pFirstBlock == pHeadFor information on how your program can cause an assertion
    failure, see the Visual C++ documentation on asserts.(Press Retry to debug the application)
    ---------------------------
    终止(A)   重试(R)   忽略(I)   
    ---------------------------
    后 点击重试 报了错误:
    ---------------------------
    Microsoft Visual C++
    ---------------------------
    Unhandled exception in newTread.exe: 0xC0000005: Access Violation.
    ---------------------------
    确定   
    ---------------------------
    堆栈信息如下:
    free_dbg(void * 0x0087a440, int 1) line 1076 + 43 bytes
    free(void * 0x0087a440) line 926 + 11 bytes
    operator delete(void * 0x0087a440) line 7 + 9 bytes
    std::allocator<WorkMapParam *>::deallocate(void * 0x0087a440, unsigned int 1) line 64 + 38 bytes
    std::_Tree<unsigned long,std::pair<unsigned long const ,WorkMapParam *>,std::map<unsigned long,WorkMapParam *,std::less<unsigned long>,std::allocator<WorkMapParam *> >::_Kfn,std::less<unsigned long>,std::allocator<WorkMapParam *> >::_Freenode(...) line 596 + 43 bytes
    std::_Tree<unsigned long,std::pair<unsigned long const ,WorkMapParam *>,std::map<unsigned long,WorkMapParam *,std::less<unsigned long>,std::allocator<WorkMapParam *> >::_Kfn,std::less<unsigned long>,std::allocator<WorkMapParam *> >::erase(...) line 362
    std::_Tree<unsigned long,std::pair<unsigned long const ,WorkMapParam *>,std::map<unsigned long,WorkMapParam *,std::less<unsigned long>,std::allocator<WorkMapParam *> >::_Kfn,std::less<unsigned long>,std::allocator<WorkMapParam *> >::erase(...) line 367 + 29 bytes
    std::_Tree<unsigned long,std::pair<unsigned long const ,WorkMapParam *>,std::map<unsigned long,WorkMapParam *,std::less<unsigned long>,std::allocator<WorkMapParam *> >::_Kfn,std::less<unsigned long>,std::allocator<WorkMapParam *> >::erase(const unsigned long & 15148) line 380
    std::map<unsigned long,WorkMapParam *,std::less<unsigned long>,std::allocator<WorkMapParam *> >::erase(const unsigned long & 15148) line 109 + 41 bytes
    CSocketInterface::_WatchThread(void * 0x0012ff38) line 214
    KERNEL32! 7c80b729()
      

  8.   

    该结构里面的数据也一直有效吗?
    我看了一下,每次worker完成后会进行阻塞状态,watch线程判断worker线程是否为阻塞状态 ,如果阻塞 才会去重置结构,也就是说 如果worker在运行中 结构是不会失效的。
      

  9.   

    之前写错了 点击重试之后 错误如下:
    ---------------------------
    Microsoft Visual C++
    ---------------------------
    User breakpoint called from code at 0x40c3cd 
    ---------------------------
    确定   
    ---------------------------
    堆栈如下:
    _free_dbg(void * 0x01232c70, int 1) line 1076 + 43 bytes
    free(void * 0x01232c70) line 926 + 11 bytes
    operator delete(void * 0x01232c70) line 7 + 9 bytes
    std::allocator<WorkMapParam *>::deallocate(void * 0x01232c70, unsigned int 1) line 64 + 38 bytes
    std::_Tree<unsigned long,std::pair<unsigned long const ,WorkMapParam *>,std::map<unsigned long,WorkMapParam *,std::less<unsigned long>,std::allocator<WorkMapParam *> >::_Kfn,std::less<unsigned long>,std::allocator<WorkMapParam *> >::_Freenode(...) line 596 + 43 bytes
    std::_Tree<unsigned long,std::pair<unsigned long const ,WorkMapParam *>,std::map<unsigned long,WorkMapParam *,std::less<unsigned long>,std::allocator<WorkMapParam *> >::_Kfn,std::less<unsigned long>,std::allocator<WorkMapParam *> >::erase(...) line 362
    std::_Tree<unsigned long,std::pair<unsigned long const ,WorkMapParam *>,std::map<unsigned long,WorkMapParam *,std::less<unsigned long>,std::allocator<WorkMapParam *> >::_Kfn,std::less<unsigned long>,std::allocator<WorkMapParam *> >::erase(...) line 367 + 29 bytes
    std::_Tree<unsigned long,std::pair<unsigned long const ,WorkMapParam *>,std::map<unsigned long,WorkMapParam *,std::less<unsigned long>,std::allocator<WorkMapParam *> >::_Kfn,std::less<unsigned long>,std::allocator<WorkMapParam *> >::erase(const unsigned long & 40837) line 380
    std::map<unsigned long,WorkMapParam *,std::less<unsigned long>,std::allocator<WorkMapParam *> >::erase(const unsigned long & 40837) line 109 + 41 bytes
    CSocketInterface::_WatchThread(void * 0x0012ff38) line 214
    KERNEL32! 7c80b729()点击:
    CSocketInterface::_WatchThread(void * 0x0012ff38) line 214
    跳转到代码:
    //无任务状态
    if(lp->m_stMemberParam.m_stData[i].m_iMissionF == 0 && lp->m_stMemberParam.m_stData[i].m_pLp != NULL)
    {
    DWORD id = lp->m_stMemberParam.m_stData[i].m_iID     ;
    //查找任务 并进行相应处理
    EnterCriticalSection(&CSocketInterface::g_cs_mission);
    std::map<DWORD,WorkMapParam *>::iterator lpk ;
    lpk = lp->m_stMissionMap.find(id);
    if(lpk != lp->m_stMissionMap.end())
    {
    lpk->second->m_iStatus = lp->m_stMemberParam.m_stData[i].m_iMissionF ;
    }
    PutOut("线程[%d] 处理完任务[%d] 结果[%d]",i,id,lpk->second->m_iStatus );
    delete lp->m_stMemberParam.m_stData[i].m_pLp;
    delete lpk->second;
    lp->m_stMissionMap.erase(lpk->first);
    lp->m_stMemberParam.m_stData[i]._Init()  ;
    lp->m_iMissionNum-- ;
    LeaveCriticalSection(&CSocketInterface::g_cs_mission);
    }_Init方法招行代码如下:
    _Init()
    {
    m_iID  = -1;
    m_iThreadFlg = 1;
    m_iTimes  = -1;
    m_iStatus  = 0;
    m_iLevel  = -1;
    m_iMissionF  = -1;
    m_tTime  = time(NULL);
    m_CreateTime = time(NULL);
    m_pLp  = NULL  ;
    }
      

  10.   

    lp->m_stMissionMap.erase(lpk->first);
    lp->m_stMemberParam.m_stData[i]._Init()   ;---- map操作是否有问题
      

  11.   

    我看了一下 操作应该是没有问题的,请问一下,是否有可能 new出来的东西过多了?