现在我需要实现如下功能:假设有两个按钮,Button1和Button2。点击Button1时,启动一个线程,执行相应的工作。点击Button2时,通知该线程结束运行。但是不是用ExitThread函数来强行结束,这个函数是不推荐使用的。
代码如下:
DWORD WINAPI ThreadProc(LPVOID lpParam)
{
...//执行线程函数的工作
//当收到某种消息时,不管线程执行到什么地方,调用函数做清理扫尾工作,并使函数返回
ClearThread(...);
return 0;
}
void OnButton1()
{ AfxBeginThread(...,ThreadProc,...);
}
void OnButton2()
{
//这里应该使用什么方法来通知线程结束呢?
}
楼主的“不管线程执行到什么地方,调用函数做清理扫尾工作,并使函数返回”这是不现实的,但也不是不可能的。
为什么不现实呢?因为每条语句执行的速度是相当相当快的,所以一个线程函数是很快被执行完毕的。你想节约这点时间是没有啥意义的。除非线程处在一个while(1)循环里重复执行某操作,比如进行IO操作,还有等待延时等等。一般这样我们会用
while(WaitForSingleObject(HANDLE,1)!=WAIT_OBJECT_0)
{
....//线程处理过程;
}
来代替while(1)循环;
关键是WaitForSingleObject函数,参数HANDLE可以是一个事件内核对象。返回值WAIT_OBJECT_0代表事件对象有信号状态。这样我们可以
HANDLE hEvent;
hEvent = CreateEvent(NULL,TRUE,FALSE,"ThreadEnd");
来创建一个事件对象,当我们需要线程结束的时候,就设置事件对象为有信号状态:SetEvent(hEvent);
这样线程就会因为WaitForSingleObject(hEvent,1)返回的 是 WAIT_OBJECT_0,而我们的循环条件是
WaitForSingleObject(HANDLE,1)!=WAIT_OBJECT_0 ;所以不成立,就退出循环了。
为什么说不是不可能呢?当然了你如果想在任意一条语句都可以退出的话,那么
还是用while(1)循环 大概像这样:
while(1)
{
if(WaitForSingleObject(HANDLE,1)==WAIT_OBJECT_0)break;
......
if(WaitForSingleObject(HANDLE,1)==WAIT_OBJECT_0)break;
.......
if(WaitForSingleObject(HANDLE,1)==WAIT_OBJECT_0)break;
........
}
也就是说在每句代码前都加上
if(WaitForSingleObject(HANDLE,1)==WAIT_OBJECT_0)break;
只是你觉得你有必要吗?
我们看见很多程序如果有“暂停”按钮,那么他的提示信息一般都会显示:“正在等待相关线程退出。。。”什么之类的,就是这个原因,线程还处在循环当中,等他执行完一次循环再检测相关事件对象的 时候就会退出了。
我说的这些是最常用的线程退出方法。
你可以设置一个变量,OnButton2时候把变量修改成某个值,线程函数工作的间隙都要检查下这个变量,如果条件符合,就直接return。
线程之间通信, 最简单地方法, 用一个全局变量提示要不要结束就好了。
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息