现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

MFC中的事件CEvent

2013-07-27 23:54 工业·编程 ⁄ 共 1497字 ⁄ 字号 暂无评论

一、实现

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的间接控制来访问它们。

给我留言

留言无头像?