本帖最后由 ATMCash4423 于 2012-02-06 17:19:22 编辑

解决方案 »

  1.   

    您问的是在程序运行中还是在程序退出后?运行中线程还在,没有退出,执行完任务之后就一直WaitForSingleObject挂在那。退出后如果线程正忙(::messagebox函数未返回),则等待1000毫秒然后TerminateThread强行结束线程。
    其实也不用TerminateThread结束线程,进程test。exe结束之后线程就自动被系统关闭了。
      

  2.   

    怎么看啊?
    我操作的堆就是线程池构造函数中new的几个线程啊~析构中delete线程~~其他的没操作啊~~请您分析分析我代码中哪有问题啊?
      

  3.   

    你直接TerminateThread强制结束线程,太暴力了吧
      

  4.   

    那程序要退出,用什么办法结束线程啊?难道线程没运行完主程序就要等到它运行完吗?
    bool CThread::DeleteThread(void)
    {
    if (!IsBusy())
    {
    IsExit = true;
    if (SetEvent(ThreadState_Event))
    return true;
    else
    return false;
    }
    Sleep(1000);
    // if (TerminateThread(Thread_HANDLE,-1))
    // return true;
    // else
      return false;

    }我注释掉TerminateThread也不行啊,还有那个错误提示啊~看来不是强行结束线程的问题~~
      

  5.   

    有可能是delete的问题,我注释掉CThreadpool::~CThreadpool(void)
    {
         DeleteAllThreads();
         //delete [] Threads;这句也没问题了
    }那是否是因为NEW了之后threads的首地址改变了,导致delete时出错?问题是我断点调试了一下,new之后和delete之前threads的值是一致的啊~请各位看看我的代码中new了几个cthread类,在cthread类中哪些代码能改变堆??
      

  6.   

    大概看了下,可能是bool CThread::DeleteThread(void)这里有问题;
    没有进行调试过,所以一时也不能肯定
      

  7.   

    我重新修改一下bool CThread::DeleteThread(void)
    {
    if (!IsBusy())
    {
    IsExit = true;
    if (SetEvent(ThreadState_Event))
    return true;
    else
    return false;
    }
    Sleep(1000);
    if (TerminateThread(Thread_HANDLE,-1))
    return true;
    else
    return false;}
    ……
    void CThread::ReleaseThread()
    {
    CloseHandle(Thread_HANDLE);
    CloseHandle(ThreadState_Event);
    task = NULL;
    }
    ……
    CThreadpool::~CThreadpool(void)
    {
    for (int i = 0; i < count; i++)
    {
    //Threads[i].DeleteThread();//如果此函数在前则会出现这个报错,
    Threads[i].ReleaseThread();//如果此函数在前则不会出现那个错误。
    Threads[i].DeleteThread();
    }
    //DeleteAllThreads();
      delete [] Threads;
    Threads = NULL;
    }我隐隐约约觉得问题是因为new的对象中有内核对象event,在close内核对象和delete对象的顺序上出了问题,导致堆被破坏~~~请明白人讲讲原理啊!
      

  8.   

    忘了说,修改的内容就是把CThread类的构造函数,析构函数中的代码分别单独做成了一个函数,然后调用。