一、实现
CEvent::CEvent(BOOL bInitiallyOwn,BOOL bManualReset,LPCTSTR pstrName,
LPSECURTY_ATTRIBUTES lpsaAttribute):CSyncObject(pstrName)
CEvent::~CEvent()
BOOL CEvent::Unlock()
在文件AFXMT.inl中实现了其他几个函数,为了提高效率,它们被定义为内联函数:
AFXMTINLINE BOOL CEvent::SetEvent()
AFXMTINLINE BOOL CEvent::PulseEvent()
AFXMTINLINE BOOL CEvent::ResetEvent()
CEvent没有重载Lock(),它继承了CSyncObject的Lock(),实现为:
BOOL CSyncObject::Lock(DWORD dwTimeout)
二、用法
和互斥类一样,也有两种用法:单独使用,和CSinglelock类配合使用。
第一种方法比较简单,下面是第二种用法,关于共享缓冲区的代码(伪代码):
CWinApp theApp;
class aBuf //声明一个类
{
private:
int buf[5];
CEvent WriteEvent;//写事件
CEvent ReadEvent;//读事件
public:
aBuf();
~aBuf();
void WriteBuf(int k);
void ReadBuf();
}
初始化类中的函数:
aBuf::aBuf():ReadEvent(TRUE) { }
aBuf::~aBuf()
void aBuf::WriteBuf(int k) : CSingleLock sLock(&ReadEvent);//读事件和 CSingleLock 类
sLock.Lock();
//进行写入缓冲区的操作
WriteEvent.SetEvent();//将写事件置为有信号
sLock.Unlock();//解锁
void aBuf::ReadBuf() : CSingleLock sLock(&WriteEvent);//写事件和 CSingleLock 类
sLock.Lock();
//读出缓冲区中的数据操作
ReadEvent.SetEvent();//将写事件置为有信号
sLock.Unlock();//解锁
aBuf gBuf; //声明全局变量,类
BOOL run;
写线程: while(run) { int k=0; gBuf.WriteEvent(k); k++; }
读线程: while(run) { gBuf.ReadEvent(k); }
main: int flag=0;
if(!AfxWinInit(::GetModuleHandle(NULL),NULL,::GetCommandLine(),0))//MFC初始化检验
{cerr<<.......... ; flag=1; }
else
{
AfxBeginThread(写线程,NULL);
AfxBeginThread(读线程,NULL);
Sleep(10000);
run = FALSE;//使得进程停止计算
}
return flag;
三、小结
这个例子与之前用win32 API写的缓冲区操作的例子,所用的函数有很大不一样,但功能和内在其实是一样的。
1、用 Win32 API 函数写的是以等待事件的到来为信号来对读、写线程进行按一定规律的操作
2、用 MFC 写的则是通过声明一个CSingleLock类来对读、写事件进行通知操作,因为事件是类中的私有成员,受到保护,所以要通过它们的友元CSingleLock的间接控制来访问它们。