我用CWinThread *pThread,开始一个线程。到程序关闭时要不要删除它啊?
我是这样做的:
::WaitForSingleObject(pThread->m_hThread, INFINITE);
delete pThread;
为什么会出错?错在最后一句话。请问错在什么地方,难道不应该删除这个线程吗?

解决方案 »

  1.   

    CWinThread对象有个m_bAutoDelete字段,它表明线程结束时是否自动释放CWinThread对象,默认是true,你可以用AfxBeginThread的dwCreateFlags置为CREATE_SUSPENDED之后,改变AfxBeginThread返回的CWinThread对象的m_bAutoDelete字段,然后再resume这个CWinThread对象。
      

  2.   

    有个问题,按照楼上的说法.如果没有先resume掉这个线程对象,是否会造成资源没释放?而且,LZ所说的释放,如果是默认为自动释放的话,在程序关闭的时候应该是由系统在销毁*pThread指针的时候释放掉资源的啊~~除非LZ的线程内占用了某些不能自动释放的资源.
      

  3.   

    --如果没有先resume掉这个线程对象,是否会造成资源没释放?
    不懂,请把问题描述清楚--而且,LZ所说的释放,如果是默认为自动释放的话,在程序关闭的时候应该是由系统在销毁*pThread指针的时候释放掉资源的啊
    你在说什么啊,我还是看不懂啊-_-!!-_-!!我的表达能力有问题?1.以CREATE_SUSPENDED调用AfxBeginThread,返回一个CWinThread对象,该对象内的线程被挂起
    2.设置CWinThread对象的m_bAutoDelete字段为false(默认为true的)
    3.调用CWinThread对象的ResumeThread方法,恢复线程执行
    4.等待线程执行完毕,就是lz的WaitForSingleObject(pThread->m_hThread, INFINITE);
    5.delete pThread如果m_bAutoDelete为true,就不应该delete pThread,这是因为当m_bAutoDelete为true时,线程执行完毕后,线程对应的CWinThread对象会自动释放。如果你对已释放的CWinThread对象的指针再次delete,就会发生非法访问。
    初步估计,lz就是犯上述错误
      

  4.   

    同意楼上的,你应该是m_bAutoDelete为true了