线程退出问题

liudonghai11 2017-09-19 03:50:03
在MFC中,我创建一个工作者线程,该线程主要用来处理一个时间很长的操作,但是在该线程处理这个操作的时候,外部有可能通过菜单进行强制中断,此时我要如何去将这个线程最快的结束掉呢。
简单说明:线程中不是由循环产生的长时间操作,而是一个顺序流程,需要很长时间才能完成。相关的书籍上都说不要使用强制结束的一些函数,比如:TerminateThread这类的函数一般不要用。如果是这样的话,我如何在能在外部有发出结束消息以后,在工作线程中能够最快的响应,然后退出该线程。求指导,谢谢!!
...全文
541 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
sky065530 2017-09-25
  • 打赏
  • 举报
回复
你定制一个windows的线程池,在PTP_CALLABCK_ENVIRON里加一个清理组,想要结束调用closethreadpoolcleanupgroup××()一系列函数就可以。
sky065530 2017-09-22
  • 打赏
  • 举报
回复
楼主,我 想了想,你那个线程是因为I/O操作才需要很长时间吗?如果是I/O操作,应该可以解决,把I/O操作变成异步I/O,然后在等待I/O完了时候把线程设成可提醒状态(waitforsingleobjectEx等函数),操作菜单时候向线程APC队列里面加一项(queueuserapc()),添加这一项的完成函数里面退出线程(调用C++运行库的_endthreadex()不要调用ExitThread())即可。或者最简单的直接取消I/O。
赵4老师 2017-09-20
  • 打赏
  • 举报
回复
《Windows核心编程》
smwhotjay 2017-09-20
  • 打赏
  • 举报
回复
while(!g_bTermnate) { xxxxxxxxx } g_bTermnate退出标志。 为true时,循环退出,线程流程走完。
sky065530 2017-09-20
  • 打赏
  • 举报
回复
或者加钩子,调用线程退出函数。
Saleayas 2017-09-20
  • 打赏
  • 举报
回复
使用一个进程来处理这种事情。 举个例子: 比如下棋的算法。 他和下棋的界面就是两个进程。 使用进程间通讯来联系,可以随时终止这个 AI 进程的。
  • 打赏
  • 举报
回复
引用 6 楼 cftxlin 的回复:
这种情况,要“能够最快的响应,然后退出该线程”,肯定不能采用优雅的方式来结束了,直接野蛮的结束是解决方法之一
或许也有,可能我不知道。如果采用楼上有几位的方法,这种需要把事件轮询使用到比较细的粒度才可以
  • 打赏
  • 举报
回复
这种情况,要“能够最快的响应,然后退出该线程”,肯定不能采用优雅的方式来结束了,直接野蛮的结束是解决方法之一
draculamx 2017-09-19
  • 打赏
  • 举报
回复
或者你在用户点击“停止”菜单以后,弹出一个对话框,显示“正在停止”,当线程停止以后,你再恢复,在此期间,用户不能操作界面,这样在界面上也好看点
draculamx 2017-09-19
  • 打赏
  • 举报
回复
引用 2 楼 liudonghai11 的回复:
[quote=引用 1 楼 zgl7903 的回复:] 用事件或标记, 线程中主动去检测 #define _QueryQuit() if(WaitForSingleObject(hExitEvent, 0) == WAIT_OBJECT_0) break; //线程 do { _QueryQuit(); …… _QueryQuit(); …… _QueryQuit(); …… }while(0);
那这样的话,为了能够更快的相应,岂不是要隔几行检测一次?[/quote] 一楼的方法最为妥当,你可以在你的线程函数中,找到那些耗时的程序段,然后添加检测代码,但是从你的程序逻辑来看,想要很快速的结束线程不容易做到,例如: 线程函数() { 检测线程是否退出 操作1;//耗时200MS 检测线程是否退出 操作2:耗时500MS } 如果是这样,那从理论上讲,你线程退出的最大时间是500MS.... 或者按楼上说的,把“检测线程是否退出”编程,“暂停线程”,但即便是这样,按照上面的例子,你依然是最大需要等待500MS才能让线程停下来
worldy 2017-09-19
  • 打赏
  • 举报
回复
线程函数(。。。) { bEnd=false; while(bEnd)//长时间操作,一般都有循环,在循环进入位置检测,如果要结束break或者goto到循环体之外,你的主线程控制bEnd { if(bEnd) break; 。。。。。。。。。。。。。 } }
liudonghai11 2017-09-19
  • 打赏
  • 举报
回复
引用 4 楼 draculamx 的回复:
[quote=引用 2 楼 liudonghai11 的回复:] [quote=引用 1 楼 zgl7903 的回复:] 用事件或标记, 线程中主动去检测 #define _QueryQuit() if(WaitForSingleObject(hExitEvent, 0) == WAIT_OBJECT_0) break; //线程 do { _QueryQuit(); …… _QueryQuit(); …… _QueryQuit(); …… }while(0);
那这样的话,为了能够更快的相应,岂不是要隔几行检测一次?[/quote] 一楼的方法最为妥当,你可以在你的线程函数中,找到那些耗时的程序段,然后添加检测代码,但是从你的程序逻辑来看,想要很快速的结束线程不容易做到,例如: 线程函数() { 检测线程是否退出 操作1;//耗时200MS 检测线程是否退出 操作2:耗时500MS } 如果是这样,那从理论上讲,你线程退出的最大时间是500MS.... 或者按楼上说的,把“检测线程是否退出”编程,“暂停线程”,但即便是这样,按照上面的例子,你依然是最大需要等待500MS才能让线程停下来 [/quote] 明白大家的意思了,估计只能采用这种方法了,对时间要求不是特别高,我以为会有一些高效的操作,所以想来请教请教,谢谢指导!!
liudonghai11 2017-09-19
  • 打赏
  • 举报
回复
引用 3 楼 sky065530 的回复:
用挂起不行吗?一定要终止?终止的话应该是 没有办法释放线程里的C/C++资源,析构函数也不会调用。我觉得如果时间很长的话为什么不创建一个子进程来完成这个工作。强制进程终了也不好,但是起码系统可以帮你清理分配的C/C++资源
挂起线程其实在效果上是差不多的,但是外部中断操作以后,我这个线程就没有用了,后面还是要将其结束,并且释放相应的资源,所以还是同一个问题。另一个就是,这个线程就是为了进行这个操作而创建的,所以再去创建线程不合适。
liudonghai11 2017-09-19
  • 打赏
  • 举报
回复
引用 1 楼 zgl7903 的回复:
用事件或标记, 线程中主动去检测 #define _QueryQuit() if(WaitForSingleObject(hExitEvent, 0) == WAIT_OBJECT_0) break; //线程 do { _QueryQuit(); …… _QueryQuit(); …… _QueryQuit(); …… }while(0);
那这样的话,为了能够更快的相应,岂不是要隔几行检测一次?
sky065530 2017-09-19
  • 打赏
  • 举报
回复
用挂起不行吗?一定要终止?终止的话应该是 没有办法释放线程里的C/C++资源,析构函数也不会调用。我觉得如果时间很长的话为什么不创建一个子进程来完成这个工作。强制进程终了也不好,但是起码系统可以帮你清理分配的C/C++资源
zgl7903 2017-09-19
  • 打赏
  • 举报
回复
用事件或标记, 线程中主动去检测 #define _QueryQuit() if(WaitForSingleObject(hExitEvent, 0) == WAIT_OBJECT_0) break; //线程 do { _QueryQuit(); …… _QueryQuit(); …… _QueryQuit(); …… }while(0);

15,471

社区成员

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

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