请教:线程删除句柄异常,使用resume后,导致怪异现象。

winnywang 2004-12-20 08:25:41
1。一个很奇怪的事情,我得程序里面是用了CB的多线程,退出时已经调用了线程terminate方法,线程也已经从execute中退出。可是当delete线程句柄时,总有中断。不知原因?
2。后来在delete操作前加入resume操作,虽然delete没有中断,但是发现偶尔有进程挂在进行列表中不能退出的情况,郁闷,请问原因?
3。请教正确释放线程句柄的方法。
...全文
151 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
特招 2005-01-02
  • 打赏
  • 举报
回复
up
yuanreid 2004-12-31
  • 打赏
  • 举报
回复
好久没有回来看这个帖子了,正如boyla(土著巫师)所说,Execute方法中不能有永久循环,同时要定时检查Terminated属性是否为真,如为真就结束线程函数。

如下的例子就是一个不好的例子(即使判断了Terminated属性)
因为GetQueuedCompletionStatus操作是永久等待。因此线程函数在结束时,会一直等待。因此在设计线程函数时要考虑留给判断Terminated属性的机会。

void __fastcall YourThreadClass::Execute()
{
……

while (!Terminated)
{
error = NO_ERROR;
rc = GetQueuedCompletionStatus(
CompletionPort,
&BytesTransfered,
(PULONG_PTR)&Key,
&lpOverlapped,
INFINITE
);
bufobj = CONTAINING_RECORD(lpOverlapped, BUFFER_OBJ, ol);

//DO your Socket Job
……
}

}
土著巫师 2004-12-29
  • 打赏
  • 举报
回复
1、
thread->Terminate();
threae->WaitFor();
delete thread;

2、Execute()方法里一定要用while(!Terminated){...},否则线程是退不出来的,直到线程执行完毕,因为Terminate方法在内部就是把Terminated置为true,这样才可以退出来。
tsk 2004-12-29
  • 打赏
  • 举报
回复
我也遇到同题,Thread->WaitFor();线程不返回,不知怎么回事!
winnywang 2004-12-21
  • 打赏
  • 举报
回复
to MEFULEU(没有作不到,只有想不到) ,FreeOnTerminate不行,因为关闭的时候线程访问界面,导致中断。
to yuanreid(闲云孤鹤) thread->WaitFor()是怎么个意思?因为我已经在teminate之后使用了win32的msgwaitfor。。。。来使得线程退出。但是释放的时候还是出中断
yuanreid 2004-12-20
  • 打赏
  • 举报
回复
thread->WaitFor();
yuanreid 2004-12-20
  • 打赏
  • 举报
回复
thread->Terminate();
threae->WaitFor();
delete thread;

这样才够安全。
MEFULEU 2004-12-20
  • 打赏
  • 举报
回复
使用 FreeOnTerminate=true;

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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