怎样立即结束一个工作者线程呢?

费新春 2013-04-06 06:52:55
我编写了个基于对话框的MFC的程序,有个两个按钮A和B,一点A按钮,启动一个工作者线程,线程函数为ThreadFun,在线程函数中要做一系列的先后顺序的工作(一步一步的,耗费很多时间)。
现在的问题是,当工作者线程运行起来后,我按下按钮B结束线程(此时工作者线程里的工作还没有完成,假设才进行了一半),我现在的程序是要等好半天才能结束,怎样才能立即结束这个工作者线程呢?
...全文
772 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
xian_wwq 2013-06-14
  • 打赏
  • 举报
回复
引用 12 楼 lm_whales 的回复:
设个全局的事件或者通过参数传递一个事件 线程每工作一小段,就检查一下事件 主线程 SetEvent 然后子线程就立即退出。
这个方法比较稳妥
lm_whales 2013-06-14
  • 打赏
  • 举报
回复
在线程里,把任务细分,每完成一小步,同步一下,如果主程序要求结束任务; 立即扫尾,然后结束任务,不然继续下一步。
这不是鸭头 2013-06-07
  • 打赏
  • 举报
回复
while(bFlag) { } bFlag = false;
hzy694358 2013-06-07
  • 打赏
  • 举报
回复
为何一定要强制退出呢,多线程并不会影响你的其他操作啊 如果确实是卡在处理过程 还真没有什么好方法,强制的话 不推荐 会产生问题
量子高宏亮 2013-06-06
  • 打赏
  • 举报
回复
AfxEndThread是在线程函数内部结束线程自身用的 TernimateThread是在线程外部,供别的函数结束一个线程的。
dongnan12 2013-06-06
  • 打赏
  • 举报
回复
强制结束吧 ternimatethread
lm_whales 2013-06-06
  • 打赏
  • 举报
回复
设个全局的事件或者通过参数传递一个事件 线程每工作一小段,就检查一下事件 主线程 SetEvent 然后子线程就立即退出。
牧童吃五谷 2013-05-04
  • 打赏
  • 举报
回复
步骤: 1。建立一个bool变量,如果该变量为true时需要结束工作者线程 2。修改工作者线程中的算法,每隔一小段时间,就要检测该bool变量,如果检测到位真值,则退出线程,其他的招数都非法 可以采用强制终止线程的函数,但强烈不建议采用,因为这个破坏了程序运行的结构,可能带来一大堆的问题,特别是内存释放
china_jeffery 2013-04-27
  • 打赏
  • 举报
回复
结束线程共有四中方法,线程函数返回、ExitThread函数、TerminateThread函数、在进程终止运行时撤消线程。方法间的差别在《Windows核心编程》中有详细介绍,我在此就不重复了。在此,我只说明其中要注意的地方。 最好结束线程的方法就是通过线程函数返回,这样可以释放掉所有的资源,包括系统资源以及C++资源。可以通过函数返回值来设置线程退出码(Exit Code)。 可以在线程函数中调用ExitThread函数来结束自己,其参数为线程退出码(Exit Code)。通过ExitThread函数结束线程时,可以释放系统资源,但是不能释放C++资源,如:若在线程函数中定义了一个类的对象,若通过ExitThread函数结束线程,则不会调用该对象的析构函数,需要在其析构函数中释放的资源将不能被释放。 通过TerminateThread函数,可以强制结束一个线程,其中第一个参数是线程句柄,第二个参数是线程退出码(Exit Code)。通过ExitThread函数结束线程,线程的栈将被销毁,而通过TerminateThread函数结束线程,线程的栈将不被销毁,因为线程是被强制结束的,系统认为可能有其他线程还会使用到该线程的资源。
weiql6 2013-04-19
  • 打赏
  • 举报
回复
AfxEndThread(一)void AFXAPI AfxEndThread(UINT nExitCode, BOOL bDelete = TRUE);//函数原型声明1 (二)void AfxEndThread(UINT nExitCode);//函数原型声明2 此方法用于终止当前正在执行的线程,必须在当前线程内部调用才能生效。 返回值:void 参数: nExitCode: 32位的线程的退出码,该退出码由GetExitCodeThread方法获得。 bDetete: 是否从内存中删除线程对象,默认值为TRUE。 必要条件: Windows CE 2.0以上版本。头文件声明在Afxwin.h中。 基于平台: 个人计算机,掌上电脑,小型机。 相关词条:AfxBeginThread TerminateThread GetExitCodeThread 参考:MSDN
smwhotjay 2013-04-12
  • 打赏
  • 举报
回复
强杀线程 我从来没这么搞过. 就是线程循环搞个flag termnate而已就行了.
maozhumao 2013-04-12
  • 打赏
  • 举报
回复
最好等它完成再结束,要不只能强制结束,不过,可能有内存泄露,这在《windows核心编程》第五版上有详细说明
无言猪 2013-04-06
  • 打赏
  • 举报
回复
3种方法,一种就是上面说的,一种就是强制退出,还有就是你在关闭的时候用另一种机制来等待。
费新春 2013-04-06
  • 打赏
  • 举报
回复
引用 1 楼 lhfslhfs 的回复:
AfxEndThread(一)void AFXAPI AfxEndThread(UINT nExitCode, BOOL bDelete = TRUE);//函数原型声明1 (二)void AfxEndThread(UINT nExitCode);//函数原型声明2 此方法用于终止当前正在执行的线程,必须在当前线程内部调用才能生效。 返回值:void ……
这算强制退出线程吗?
费新春 2013-04-06
  • 打赏
  • 举报
回复
引用 2 楼 lostying 的回复:
在一系列工作之间加入线程是否结束的判断,缩短两次线程结束条件判断之间的间隔时间。
我也考虑这个办法了,无奈步骤太多了,能不能有更简洁了当的办法呢?
无言猪 2013-04-06
  • 打赏
  • 举报
回复
在一系列工作之间加入线程是否结束的判断,缩短两次线程结束条件判断之间的间隔时间。
青松2 2013-04-06
  • 打赏
  • 举报
回复
AfxEndThread(一)void AFXAPI AfxEndThread(UINT nExitCode, BOOL bDelete = TRUE);//函数原型声明1 (二)void AfxEndThread(UINT nExitCode);//函数原型声明2 此方法用于终止当前正在执行的线程,必须在当前线程内部调用才能生效。 返回值:void 参数: nExitCode: 32位的线程的退出码,该退出码由GetExitCodeThread方法获得。 bDetete: 是否从内存中删除线程对象,默认值为TRUE。 必要条件: Windows CE 2.0以上版本。头文件声明在Afxwin.h中。 基于平台: 个人计算机,掌上电脑,小型机。 相关词条:AfxBeginThread TerminateThread GetExitCodeThread 参考:MSDN

15,466

社区成员

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

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