如此效率低下的Event类!!

zzuu 2004-03-29 10:26:12
我想在一定的条件下结束线程,这个条件是在线程的父进程中判断的,用了以下两种方法:
方法一:
定义一个Event对象的句柄:HANDLE hEvent;

创建该Event对象:hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);

在终止线程的条件成熟时调用:SetEvent(hEvent);

创建线程函数:AfxBeginThread(Thread,&this->hEvent);

线程函数:
UINT Thread(LPVOID lParam)
{
HANDLE* hEvent=(HANDLE*)lParam;
for(int i=0;i<2147483647;i++)//只是举个运算量很大的例子
{
if(WaitForSingleObject(*hEvent,0)==WAIT_OBJECT_0)
break;
......
//这里做些计算量不是太大的计算
......
}
return 0
}

方法二:
定义一个BOOL型变量:BOOL isAbort;

初始化这个BOOL型变量:isAbort=FALSE;

在终止线程的条件成熟时:isAbort=TRUE;

创建线程函数:AfxBeginThread(Thread,&this->isAbort);

线程函数:
UINT Thread(LPVOID lParam)
{
BOOL* isAbort=(BOOL*)lParam;
for(int i=0;i<2147483647;i++)//只是举个运算量很大的例子
{
if(*isAbort)
break;
......
//这里做些计算量不是太大的计算
......
}
return 0
}
这两种方法都能实现线程的即时安全终止,可是比较这两种方法你会发现,第二种方法的执行速度是第一种的三到四倍,如果省略号中的语句计算量更小的话,第一种还会比第二种成倍的慢。
如此低效率的Event类,我们还用它干什么?难道必需用它,我上面的第二种方法,调试了这么久,好像也没发现错误。希望大家给我点经验,那些地方用Event比较适合?

另外,上面说的两方法,不管第二种方法的效率有多高,他们始终还是程序查询方式的,能否改成中断方式呢?我想了很久也找不到解决的办法,希望各位高手帮忙!
...全文
51 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzuu 2004-03-31
  • 打赏
  • 举报
回复
楼上的,对于你说的:
可以想一下,如果你的bool值不是主线程的,而是另一个线程的,你怎么知道他的值呢?

请问用Event还不是要一个hEvent变量,按你所说,如果不是主线程的,也不知道他的值啊!
wened 2004-03-31
  • 打赏
  • 举报
回复
bool做为全局变量,声明为 violate
kof99th 2004-03-29
  • 打赏
  • 举报
回复
晕掉了,event可是内核对象啊,用的时候系统要切换到内核态的,当然要慢了。

可以想一下,如果你的bool值不是主线程的,而是另一个线程的,你怎么知道他的值呢?
Oversense 2004-03-29
  • 打赏
  • 举报
回复
帅哥,你用错了,Event不是用来做这个的,对于你这种需求,就直接用第二种方法。
也是官方的方法。
Pipi0714 2004-03-29
  • 打赏
  • 举报
回复
其实第二种方法完全可以给为
while(!isAbort) 这种方式可不可以
{
....
}
Pipi0714 2004-03-29
  • 打赏
  • 举报
回复
假如需要等待监视什么东东时候第二种方法就不行了.执行布尔判断当然比执行wait....函数快了。

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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