线程的终止问题

laole 2000-04-24 02:11:00
加精
有一个线程,是阻塞方式调用的,调用的方式为
AfxBeginThread(.....);
WaitForSingleObject(thread,...);
当线程没有完成之前!
我怎样才能终止它呢?
例如线程是在ontimer中进行的,用户点机了系统中的
退出菜单,这样才能很快退出,而不让用户等候?
...全文
1618 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
wpmsoft 2000-08-24
  • 打赏
  • 举报
回复
这个问题也正困着我,还有更详细的帮助吗?谢谢。
五行擒拿术 2000-08-21
  • 打赏
  • 举报
回复
laole:
你是怎样强行终止线程的?你说的终止是从线程外部终止吗?调用TerminateThread()??没有内存泄露?TerminateThread不会释放线程的栈呀。
我也遇到了这种问题,辅助线程是一个下载的线程,如果在线程中用
while( m_IsStop )
{
...
处理程序段;
}
检测变量的方式来终止线程,则会因为“处理程序段”的执行时间过长(是一段从Internet上读数据的代码),而造成用户等待时间过长。而用TerminateThread()从外部终止线程,又会引起内存的泄露,怎么办?有没有办法能够立即终止线程,而不需要等待线程自己来退出??


五行擒拿术 2000-08-21
  • 打赏
  • 举报
回复
laole:
lsm78 2000-08-09
  • 打赏
  • 举报
回复
three way you can cancel you thread program:
1: use the TerminateThread funtion
2: use the ExitThread
3: selfdefine a message
all these way can be founded in msdn if you have any problem
please mail to me smli@bj.bexcom.com
dcrwy 2000-07-26
  • 打赏
  • 举报
回复
你用的一定是辅助线程,解决方法如下:
1.首先定义一个全局事件对象
CEVENT eventKill;
2.在线程中加入
for(...)
{
//此处加入你的程序
//然后
if(WaitForSingleObject(eventKill,0)==WAIT_OBJECT_0)
{
//退出处理
return 0;
}
}
此处的目的是在每次循环结束检测事件是否发生,不管是否发生都立即返回,如返回WAIT_OBJECT_0
则说明已发生,此时退出即可,
3.需要终止线程的时候,在主线程中调用
eventKill.SetEvent();
即可
Gold_Eg 2000-06-22
  • 打赏
  • 举报
回复
最好的办法就是发一个它正在等待的事件,用欺骗的方法使之认为条件满足,并设置一
标志,然后在它接下来的处理中检查这个标志,再决定是否退出
laole 2000-04-24
  • 打赏
  • 举报
回复
2位大下的方法我有时间再试!
laole 2000-04-24
  • 打赏
  • 举报
回复
谢谢各位大下,此问题已经解决.
我修改了子现成的模块,定义了消息
主现成里面用非阻塞的方式调用,界面
不会四掉,退出的时候,强行终止子现成.
sunsetyang 2000-04-24
  • 打赏
  • 举报
回复
在主线程中生成一个event,作为标记是否要退出线程的标记。
h[0]=主线程中的event;
h[1]=工作线程中的event:
在工作线程中使用:
i=WaitForMultipleObjectsEx(2, h, FALSE, INFINITE, FALSE);
if(i==0) TerminateThread();
要退出时只需在主线程中对event调用:SetEvent(event)即可。
在你的处理中,只要对菜单的响应中写入SetEvent即可。
telan 2000-04-24
  • 打赏
  • 举报
回复
在主线程中用:
MsgWaitForMultipleObjects(...)
代替
WaitForSingleObject(...)的调用。
(我没有试过,你可以试试)
laole 2000-04-24
  • 打赏
  • 举报
回复
我的程序是定时的从一个服务器取数据,取数据的过程用的是一个线程。
在时间到来的时候,我就开一个取数据的线程,当然用的是阻塞模式,如
果用户想退出,必须等待线程结束,这样很不友好。有没有什么好的方法
让我的程序改动最小,当用户退出的时候,系统很快进行响应?
laole 2000-04-24
  • 打赏
  • 举报
回复
telan大侠,我是在主线程中调用了waitforsingleobject(。。。。)
而且这个程序都做好了,发现要退出程序,必须中止线程。现在有没有什么方法
在不改变程序结构的前提下,中止线程呢?
telan 2000-04-24
  • 打赏
  • 举报
回复
你是不是在主线程的某个地方调用了
WaitForSingleObject(thread,...)
如果是这样的话,主线程当然会阻塞在
这儿,当然就对用户界面的操作没有反应。

不知道你要实现什么功能,但是应该可以用这样的
方式:
子线程结束之前,给主线程发一个自定义消息,通知
子线程的工作已经完成;SendMessage(....),然后
主线程可以在响应自定义消息的函数中接着做余下的
事情,这样主界面就不会死掉了。


laole 2000-04-24
  • 打赏
  • 举报
回复
现在的问题是,当我点击退出系统的时候,系统根本不对用户的
消息进行响应。而是仍然等待子线程的结束,这是为什么?
是线程的优先级的问题吗?可是我把它设置成LOWEST,还是不行压
telan 2000-04-24
  • 打赏
  • 举报
回复
当然用TerminateThread(..)函数是不太好的,最好当然是主线程通知
子线程终止,比如可以用事件,在子线程的某个地方也:
WaitForSingleObject(hEvent...)或WaitForMultiObjetc,主线程想关闭
子线程时就SetEvent(hEvent).

15,471

社区成员

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

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