事件(CEvent)——MFC

来源:互联网 发布:网络教育录取查询 编辑:程序博客网 时间:2024/04/30 10:37

一、实现

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

0 0