结束线程后句柄未销毁的问题

灿烂李 2012-05-18 06:50:38
创建线程,线程内部什么都不做,结果线程自动结束后,多出6个句柄没有释放。
到底是什么原因呢?

DWORD dwThreadId;
m_hStartWork = CreateThread(NULL,0,CDlgVirtualChannelTransfer::ThreadStartVirChanTrans,this,0,&dwThreadId);


unsigned long __stdcall CDlgVirtualChannelTransfer::ThreadStartVirChanTrans( void* pParam )
{
CDlgVirtualChannelTransfer* pDlgVirChan = (CDlgVirtualChannelTransfer*)pParam;

CloseHandle(pDlgVirChan->m_hStartWork);
//pDlgVirChan->m_hStartWork = NULL;
return 1;
}

CloseHandle 放到外面去控制也不行。

有赐教的吗,谢谢了。
...全文
353 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2012-05-22
  • 打赏
  • 举报
回复
就算有泄露也不会出现6个句柄啊
anmychen2001 2012-05-22
  • 打赏
  • 举报
回复
if( m_hRunThread != NULL )
{
SetEvent( m_evntStop ) ;

if( WAIT_FAILED == WaitForSingleObject( m_hRunThread, 1000 ) )
{
TRACE0( "Failed to End process!\r\n" ) ;
}

CloseHandle( m_hRunThread ) ;

m_hRunThread = NULL ;
}
vivian_sxg 2012-05-22
  • 打赏
  • 举报
回复
把句柄声明为全局变量试试
灿烂李 2012-05-21
  • 打赏
  • 举报
回复
CloseHandle 返回是成功的。

把 CloseHandle 放到函数外面,等线程函数运行完比后 close,句柄也没销毁。
「已注销」 2012-05-20
  • 打赏
  • 举报
回复
存在一种可能性:


看这句话
m_hStartWork = CreateThread(NULL,0,CDlgVirtualChannelTransfer::ThreadStartVirChanTrans,this,0,&dwThreadId);

在执行完CreateThread之后,即在未执行对m_hStartWork赋值之前,当前操作系统调度了新建立的线程,执行了线程里的代码: CloseHandle(pDlgVirChan->m_hStartWork);

结果导致 CloseHandle 执行错误。而并未按照预期的关闭此线程的句柄。
Eleven 2012-05-19
  • 打赏
  • 举报
回复
CloseHandle(CreateThread(NULL,0,CDlgVirtualChannelTransfer::ThreadStartVirChanTrans,this,0,&dwThreadId));
shuzhongxunyu 2012-05-19
  • 打赏
  • 举报
回复
closehandle不行吗
昨夜无风 2012-05-18
  • 打赏
  • 举报
回复
在CreateThread后,直接CloseHandle(m_hStartWork );

但是,感觉应该不是线程的句柄,再查查看

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧