void CDlgC::OnBnClickedButton2() //执行脚本
{
// TODO: 在此添加控件通知处理程序代码
if(L){
AfxMessageBox("已执行!如关闭请点击停止!");
return ;
}
::CloseHandle(::CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)FunScript_1,(LPVOID)this,0,&Script_pid));
}void CDlgC::OnBnClickedButton8()
{
// TODO: 在此添加控件通知处理程序代码
HANDLE h;
h=::OpenThread(PROCESS_ALL_ACCESS,false,Script_pid); //打开线程获取句柄值
::TerminateThread(h,-1);
CloseHandle(h);
if(L){
lua_close(L);
L=0;
}
pboot->m_bStartAuto =false;
TRACE("Set false %s %d",__FILE__,__LINE__);
pboot->m_pmain .m_param .ClearParam();
}
这个线程在创建的时候不就是调用CloseThread关闭句柄了吗?
为啥还可以再次关闭的呢?>?
疑惑啊,
AfxBeginThread创建线程的时候也会返回一个对象指针,
那么是不是也可以在创建后就调用CloseThread关闭他呢/书上的介绍是创建了内核对象必须得关闭了。 创建了内核对象计数增加1,
郁闷啊。搞糊涂了..求各位高手解答一下,
这个在创建线程时候就调用CloseThread关闭线程句柄,会对线程的执行造成影响吗?

解决方案 »

  1.   

    CloseThread关闭线程句柄?CloseHandle关闭线程句柄?
      

  2.   

    1.CloseHandel(ThreadHandle );
    只是关闭了一个线程句柄对象,表示我不再使用该句柄,对该句柄不感兴趣,即不对这个句柄对应的线程做任何干预了。并没有结束线程,线程本身还在继续运行。如果你CreateThread以后需要对这个线程做一些操作,比如改变优先级,被其他线程等待,强制TermateThread等,就要保存这个句柄,使用完了再CloseHandle()。      2.为什么要CreateThread()和CloseHandle()紧挨配套使用一方面,所有的内核对象(包括线程Handle)都是系统资源,用了要还的,也就是说用完后一定要CloseHandle关闭之,如果不这么做,你系统的句柄资源很快就用光了,另一方面,由于CreateThread()后线程内核对象的引用计数是2,在CloseHandle()引用计数-1之后,内核对象引用计数仍不为0,不会被释放,所以线程仍运行,直到线程函数执行完毕后,引用计数再-1,线程结束。
      

  3.   

    求各位高手解答一下,
    这个在创建线程时候就调用CloseThread关闭线程句柄,会对线程的执行造成影响吗?
    -------------------
    不会,CloseHandle是递减内核对象的引用计数,当索引值为0的时候,操作系统删除该内核对象。对你线程本身的执行没有任何的影响