事件(CEvent)——MFC

一、实现

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值