请问,在线程执行函数中,能够关闭此线程句柄吗?如果不能,应该在何处关闭句柄?例:
BOOL  Calarm::StartThread()    //创建线程
{
HThread = CreateTread(0, 0, 
                    (LPTHREAD_START_ROUTINE)Excution,
                    0, 0, &id);
}Dword CAlarm::Excution(LPDWORD param) //线程的执行函数
{
if (nRunning)
{
   
  DoSomething( );
return 1;
}
}
void  CAlarm ::DoSomething( )  //调用函数
{
  CloseHandle( HThread);    //在这里关闭函数句柄,可以吗?
}

解决方案 »

  1.   

    关闭线程句柄并不能终止关联的线程,你必须调用TerminateThread()终止线程
      

  2.   

    关闭线程句柄并不能终止关联的线程,你必须调用TerminateThread()终止线程或在线程里设一标志让它return都可以的
      

  3.   

    操作系统用一个线程内核对象来管理线程,一个句柄就标识了一个内核对象,你只有通过这个句柄才能访问线程。内核对象有一个引用计数,表明当前有多少句柄关联到这个内核对象,当该计数为0时,系统就会销毁这个对象。CloseHandle的作用就是关闭一个句柄,使用线程内核对象的引用计数减一。注意只是引用计数减一,不会关闭你创建的线程。所以,如果你创建了一个线程并且不会再去访问它,就可以立即调用CloseHandle,这不会对线程运行有任何影响;当线程运行完毕以后,你应该调用CloseHandle(如果以前没有调用过的话),否则线程内核对象的引用计数仍大于0,系统仍然会保留它(即使你已经不会再去访问它了),这显示会造成一些内存的浪费。
      

  4.   

    最好在你刚创建完内核对象(包括线程,进程,事件等等)就立即调用
    CloseHandle(HANDLE h)关闭该句柄,防止因遗忘而疏忽关闭它,造成内存泄漏。
    当然,这些并不是必须的,因为在程序结束时,OS会把这一切处理得很完美。
    但作为程序员,我想应该让自己的程序看上去无懈可击,不留任何遗憾,自己的感觉会
    越来越好。
      

  5.   

      CloseHandle(CreateThread(..))
      

  6.   

    关闭这个句柄后就不能用TerminateThread了。
      

  7.   

    这端时间好忙,来报个到!^_^
    CloseHandle();