如果用TerminateThread不会释放资源。但书上说,用TerminateThread后紧接这ExitInstance,CloseHandle就能释放资源。是这样的吗?如果用AfxEndThread终止,具体该怎么用?

解决方案 »

  1.   

    当你调用ExitInstance()函数的时候,你的应用程序也就结束了,当应用程序结束以后操作系统会负责回收进程中所有的资源!在线程函数中直接使用AfxEndThread()函数就可以使线程退出!
    例如你的线程函数如下:
    UINT ThreadFunc(LPVOID lparam)
    {
        AfxEndThread(0);//就可以使当前线程强行退出
    }
    不过一般情况下也不提倡使用AfxEndThread这个函数来结束线程,他令操作系统强行清楚该线程所使用的资源而且会造成c++对象不能正确的调用其析构函数!
    例如:
    #include <windows.h>
    #include <stdio.h>
    class obj {
    public:
        obj(){printf("constructor")};
        ~obj(){prinf("destructor")};
    };obj g_obj;
    int main() {
        obj localobj;
        ExitThread(0);//在这里使用ExitThread,他和AfxExitThread等效
    }看一下运行结果就会很清楚了,结果表明对象的析构函数没有被调用建议使用一种比较好的方式来结束线程的执行使用Event对象HANDLE hEvent;
    hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);//创建手工重置的Event对象
    UINT ThreadFunc(LPVOID lparam)
    {
       .......
       if( WaitForSingleObject(hEvent,0) == WAIT_OBJECT_0)
          return 0;//让线程函数正常返回就没有问题了
       return 0;
    }希望对你有所帮助!
      

  2.   

    sorry,忘了说一点,在希望线程结束的时候你可以使用SetEvent(hEvent);来把hEvnet设置为激发状态,这样WaitForSingleObject()函数就会返回WAIT_OBJECT_0,这样线程函数就可以正常返回,c++对象的析构函数也可以正常调用了!