TerminateThread(((CMyApp*)pThread)->m_hThread,0);
会自动释放其所站用的内存。

解决方案 »

  1.   

    但是执行delete (CMyApp*)pThread;没有报错啊
      

  2.   

    我想是这样的:(可能不正确^o^)
    TerminateThread(((CMyApp*)pThread)->m_hThread,0);
    //只是发了一个让线程终止的消息
    //线程收到消息后才删除自身,释放资源
    //因为线程内部可能分配了其他资源
    delete (CMyApp*)pThread; 
    //这儿只是表面上把线程删除了
    //线程占有的资源可能并没有释放
    mailinfo.pThread = NULL;
      

  3.   


    那如果是这样,delete (CMyApp*)pThread; 之后,
    线程执行结束也会自动释放资源啊
      

  4.   

    TerminateThread是不会释放资源的。你应该用ExitThread()函数结束线程。
      

  5.   


    很危险的东西,编程最好不用,最好让线程自动返回,TerminateThread(((CMyApp*)pThread)->m_hThread,0);在线程返回后还调用他有什么用?
      

  6.   


    是这样,我需要的是如果线程在一定时间没有返回,则需要强行关闭。
    ExitThread()需要在线程里面调用。线程如果被阻塞没有返回就没办法了
      

  7.   

    TerminateThread是绝对不会释放资源的。
      

  8.   

    强行结束线程是不会释放资源的。
    如果是工作者线程则退出线程函数后,线程也会自动退出,并释放资源;
    如果是用户界面线程,则大概是执行完CWinThread::Run()后线程自动退出。
      

  9.   

    操作系统在某一个进程或线程结束后(无论是正常的还是非正常的),都会尽最大可能地释放其所占用的资源。如果是正常结束,操作系统所做的这部分工作没什么负担——因为你的程序会处理;否则,操作系统则竭尽所能地来“擦屁股”——但这种擦法,主要依赖操作系统对某个进程或线程纪录的信息,而这种信息并不总是全面和可靠的(比如操作系统绝对不会去调用某个对象的析购函数)。总之一句话,闲来无事,不要乱用Terminate之类的函数。
      

  10.   

    我不是闲来无事啊,是确有这个必要,如果线程条件不满足长时间等待怎么办?
    有什么办法让他终止?除了用TerminateThread
      

  11.   

    应该让线程自己来判断到底等了多长时间,如果超时,就自己退出;而不是在主线程中判断超时,然后Terminate。比如你可以在线程中用WaitForSingleObject等待一个事件,调用时就指定超时值(你甚至可以将超时指定得很小,然后再用循环多次调用,已达到更精细的目的),超时以后线程自己处理。其他的情况也可类似地用此方法实现。
    再一种情况就是,在线程中将很耗时的操作分成小时间片来运行,以保证在用户可以忍受的时间限度内,你的线程可以正常终止。比如原来你的线程是进行一个长时间的数据运算,那么你最好在每次循环等地方(甚至更精细的地方)都加上是否退出的判断,以此避免Terminate的调用。
    总之,线程同步问题总是有办法解决的,对Terminate的调用,只要程序逻辑设计好,应该可以避免。
      

  12.   


    是这样,我的线程是用socket阻塞通讯的,一段时间内没收到消息也没有出错的话,
    仍处于阻塞状态,怎么来让线程自己结束呢?
      

  13.   

    最笨的方法: socket做成PUBLIC,在外面closesocket,线程自己会结束.
    好点的方法: 线程里select,而不是仅仅recv
    最好的方法: 我不知道
      

  14.   

    TerminateThread(((CMyApp*)pThread)->m_hThread,0); 
     是很不好的方法 你可以试试给你的线程发message让系统去干剩下的事情。
     microsoft 的文档不主张用 TerminateThread;
    TerminateThread is used to cause a thread to exit. When this occurs, the target thread has no chance to execute any user-mode code and its initial stack is not deallocated. DLLs attached to the thread are not notified that the thread is terminating. 
     我有个办法不知道能不能行得通:
      1. 给线程发消息让它终止
      2. delete 你的句柄
      

  15.   

    因为线程自己结束系统会将消息通知给线程调用的DLL们,而使用TerminateThread则不会,所以不提倡使用。我想Delete也是同样道理。《深入浅出MFC》有详细论述。