如此效率低下的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比较适合?
另外,上面说的两方法,不管第二种方法的效率有多高,他们始终还是程序查询方式的,能否改成中断方式呢?我想了很久也找不到解决的办法,希望各位高手帮忙!