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

时间:2021-08-05 05:43:05
我编写了个基于对话框的MFC的程序,有个两个按钮A和B,一点A按钮,启动一个工作者线程,线程函数为ThreadFun,在线程函数中要做一系列的先后顺序的工作(一步一步的,耗费很多时间)。
现在的问题是,当工作者线程运行起来后,我按下按钮B结束线程(此时工作者线程里的工作还没有完成,假设才进行了一半),我现在的程序是要等好半天才能结束,怎样才能立即结束这个工作者线程呢?

18 个解决方案

#1


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

#2


在一系列工作之间加入线程是否结束的判断,缩短两次线程结束条件判断之间的间隔时间。

#3


引用 2 楼 lostying 的回复:
在一系列工作之间加入线程是否结束的判断,缩短两次线程结束条件判断之间的间隔时间。

我也考虑这个办法了,无奈步骤太多了,能不能有更简洁了当的办法呢?

#4


引用 1 楼 lhfslhfs 的回复:
AfxEndThread(一)void AFXAPI   AfxEndThread(UINT nExitCode,
BOOL bDelete = TRUE);//函数原型声明1
(二)void   AfxEndThread(UINT  nExitCode);//函数原型声明2
此方法用于终止当前正在执行的线程,必须在当前线程内部调用才能生效。
返回值:void
……

这算强制退出线程吗?

#5


3种方法,一种就是上面说的,一种就是强制退出,还有就是你在关闭的时候用另一种机制来等待。

#6


最好等它完成再结束,要不只能强制结束,不过,可能有内存泄露,这在《windows核心编程》第五版上有详细说明

#7


强杀线程 我从来没这么搞过.
就是线程循环搞个flag termnate而已就行了.

#8


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

#9


结束线程共有四中方法,线程函数返回、ExitThread函数、TerminateThread函数、在进程终止运行时撤消线程。方法间的差别在《Windows核心编程》中有详细介绍,我在此就不重复了。在此,我只说明其中要注意的地方。
最好结束线程的方法就是通过线程函数返回,这样可以释放掉所有的资源,包括系统资源以及C++资源。可以通过函数返回值来设置线程退出码(Exit Code)。
可以在线程函数中调用ExitThread函数来结束自己,其参数为线程退出码(Exit Code)。通过ExitThread函数结束线程时,可以释放系统资源,但是不能释放C++资源,如:若在线程函数中定义了一个类的对象,若通过ExitThread函数结束线程,则不会调用该对象的析构函数,需要在其析构函数中释放的资源将不能被释放。
通过TerminateThread函数,可以强制结束一个线程,其中第一个参数是线程句柄,第二个参数是线程退出码(Exit Code)。通过ExitThread函数结束线程,线程的栈将被销毁,而通过TerminateThread函数结束线程,线程的栈将不被销毁,因为线程是被强制结束的,系统认为可能有其他线程还会使用到该线程的资源。

#10


步骤:
1。建立一个bool变量,如果该变量为true时需要结束工作者线程
2。修改工作者线程中的算法,每隔一小段时间,就要检测该bool变量,如果检测到位真值,则退出线程,其他的招数都非法

可以采用强制终止线程的函数,但强烈不建议采用,因为这个破坏了程序运行的结构,可能带来一大堆的问题,特别是内存释放

#11


该回复于2013-05-05 09:38:27被管理员删除

#12


设个全局的事件或者通过参数传递一个事件
线程每工作一小段,就检查一下事件 
主线程 SetEvent 然后子线程就立即退出。  

#13


强制结束吧  ternimatethread

#14


AfxEndThread是在线程函数内部结束线程自身用的
TernimateThread是在线程外部,供别的函数结束一个线程的。

#15


为何一定要强制退出呢,多线程并不会影响你的其他操作啊
如果确实是卡在处理过程 还真没有什么好方法,强制的话 不推荐 会产生问题

#16


while(bFlag)
{
}


bFlag = false;

#17


在线程里,把任务细分,每完成一小步,同步一下,如果主程序要求结束任务;
立即扫尾,然后结束任务,不然继续下一步。

#18


引用 12 楼 lm_whales 的回复:
设个全局的事件或者通过参数传递一个事件
线程每工作一小段,就检查一下事件 
主线程 SetEvent 然后子线程就立即退出。  

这个方法比较稳妥

#1


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

#2


在一系列工作之间加入线程是否结束的判断,缩短两次线程结束条件判断之间的间隔时间。

#3


引用 2 楼 lostying 的回复:
在一系列工作之间加入线程是否结束的判断,缩短两次线程结束条件判断之间的间隔时间。

我也考虑这个办法了,无奈步骤太多了,能不能有更简洁了当的办法呢?

#4


引用 1 楼 lhfslhfs 的回复:
AfxEndThread(一)void AFXAPI   AfxEndThread(UINT nExitCode,
BOOL bDelete = TRUE);//函数原型声明1
(二)void   AfxEndThread(UINT  nExitCode);//函数原型声明2
此方法用于终止当前正在执行的线程,必须在当前线程内部调用才能生效。
返回值:void
……

这算强制退出线程吗?

#5


3种方法,一种就是上面说的,一种就是强制退出,还有就是你在关闭的时候用另一种机制来等待。

#6


最好等它完成再结束,要不只能强制结束,不过,可能有内存泄露,这在《windows核心编程》第五版上有详细说明

#7


强杀线程 我从来没这么搞过.
就是线程循环搞个flag termnate而已就行了.

#8


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

#9


结束线程共有四中方法,线程函数返回、ExitThread函数、TerminateThread函数、在进程终止运行时撤消线程。方法间的差别在《Windows核心编程》中有详细介绍,我在此就不重复了。在此,我只说明其中要注意的地方。
最好结束线程的方法就是通过线程函数返回,这样可以释放掉所有的资源,包括系统资源以及C++资源。可以通过函数返回值来设置线程退出码(Exit Code)。
可以在线程函数中调用ExitThread函数来结束自己,其参数为线程退出码(Exit Code)。通过ExitThread函数结束线程时,可以释放系统资源,但是不能释放C++资源,如:若在线程函数中定义了一个类的对象,若通过ExitThread函数结束线程,则不会调用该对象的析构函数,需要在其析构函数中释放的资源将不能被释放。
通过TerminateThread函数,可以强制结束一个线程,其中第一个参数是线程句柄,第二个参数是线程退出码(Exit Code)。通过ExitThread函数结束线程,线程的栈将被销毁,而通过TerminateThread函数结束线程,线程的栈将不被销毁,因为线程是被强制结束的,系统认为可能有其他线程还会使用到该线程的资源。

#10


步骤:
1。建立一个bool变量,如果该变量为true时需要结束工作者线程
2。修改工作者线程中的算法,每隔一小段时间,就要检测该bool变量,如果检测到位真值,则退出线程,其他的招数都非法

可以采用强制终止线程的函数,但强烈不建议采用,因为这个破坏了程序运行的结构,可能带来一大堆的问题,特别是内存释放

#11


该回复于2013-05-05 09:38:27被管理员删除

#12


设个全局的事件或者通过参数传递一个事件
线程每工作一小段,就检查一下事件 
主线程 SetEvent 然后子线程就立即退出。  

#13


强制结束吧  ternimatethread

#14


AfxEndThread是在线程函数内部结束线程自身用的
TernimateThread是在线程外部,供别的函数结束一个线程的。

#15


为何一定要强制退出呢,多线程并不会影响你的其他操作啊
如果确实是卡在处理过程 还真没有什么好方法,强制的话 不推荐 会产生问题

#16


while(bFlag)
{
}


bFlag = false;

#17


在线程里,把任务细分,每完成一小步,同步一下,如果主程序要求结束任务;
立即扫尾,然后结束任务,不然继续下一步。

#18


引用 12 楼 lm_whales 的回复:
设个全局的事件或者通过参数传递一个事件
线程每工作一小段,就检查一下事件 
主线程 SetEvent 然后子线程就立即退出。  

这个方法比较稳妥