永发信息网

如何通知线程结束运行

答案:3  悬赏:0  手机版
解决时间 2021-07-18 16:21
  • 提问者网友:骑士
  • 2021-07-18 13:12

现在我需要实现如下功能:假设有两个按钮,Button1和Button2。点击Button1时,启动一个线程,执行相应的工作。点击Button2时,通知该线程结束运行。但是不是用ExitThread函数来强行结束,这个函数是不推荐使用的。

代码如下:

DWORD WINAPI ThreadProc(LPVOID lpParam)

{

...//执行线程函数的工作

//当收到某种消息时,不管线程执行到什么地方,调用函数做清理扫尾工作,并使函数返回

ClearThread(...);

return 0;

}

void OnButton1()

{ AfxBeginThread(...,ThreadProc,...);

}

void OnButton2()

{

//这里应该使用什么方法来通知线程结束呢?

最佳答案
  • 五星知识达人网友:洒脱疯子
  • 2021-07-18 14:51

楼主的“不管线程执行到什么地方,调用函数做清理扫尾工作,并使函数返回”这是不现实的,但也不是不可能的。


为什么不现实呢?因为每条语句执行的速度是相当相当快的,所以一个线程函数是很快被执行完毕的。你想节约这点时间是没有啥意义的。除非线程处在一个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;


只是你觉得你有必要吗?



我们看见很多程序如果有“暂停”按钮,那么他的提示信息一般都会显示:“正在等待相关线程退出。。。”什么之类的,就是这个原因,线程还处在循环当中,等他执行完一次循环再检测相关事件对象的 时候就会退出了。


我说的这些是最常用的线程退出方法。

全部回答
  • 1楼网友:有你哪都是故乡
  • 2021-07-18 16:36

你可以设置一个变量,OnButton2时候把变量修改成某个值,线程函数工作的间隙都要检查下这个变量,如果条件符合,就直接return。

  • 2楼网友:舍身薄凉客
  • 2021-07-18 15:30

线程之间通信, 最简单地方法, 用一个全局变量提示要不要结束就好了。

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯