MFC 线程同步—— CEvent类

    xiaoxiao2021-08-14  151

    CEvent类          CEvent类提供了对事件的支持。事件是一个允许一个线程在某种情况发生时,唤醒另外一个线程的同步对象。事件告诉线程何时去执行某一个给定的任务,从而使多个线程流平滑。          例如在某些网络应用程序中,一个线程(记为A)负责监听通信端口,另一个线程(记为B)负责更新用户数据。通过使用CEvent类,线程A可以通知线程B何时更新用户数据,这样线程B可以尽快地更新用户数据。       每一个CEvent类对象可以有两种状态:有信号状态和无信号状态。

          MFC中,CEvent类对象有两种类型:人工事件和自动事件。

           自动事件:一个自动的CEvent对象在被至少一个线程释放后会自动返回到无信号状态。        人工事件:人工的CEvent对象获得信号后,释放可利用线程,但直到调用成员函数ResetEvent()才将其设置为无信号状态。

     CEvent类的构造函数:

           CEvent(BOOL bInitiallyOwn = FALSE, //事件对象初始化状态 TURE有信号,FALSE无信号                       BOOL bMaualReset = FALSE,//指定创建的是人工事件还是自动事件,TRUE为人工事件,FALSE为自动事件                       LPCTSTR lpszName = NULL, //后两个参数是CEvent对象的名称和安全属性,通常设 为 NULL。                     LPSECURITY_ATTRIBUTES lpsaAttribute = NULL); 改变CEvent对象状态的函数 BOOL SetEvent()函数       该函数将CEvent类对象的状态设置为有信号状态,并且释放所有等待的线程; 

           如果该事件是人工事件,则CEvent类对象保持为有信号状态,直到调用成员函数ResetEvent()将其重新设为无信号状态时为止,这样该事件就可以释放多个线程;

          如果该事件是自动事件,则在SetEvent()将事件设置为有信号状态后,CEvent累对象有系统自动重置为无信号状态,除非一个线程被释放。 BOOL ResetEvent()函数

          该函数将事件状态设置为无信号状态,并保持该状态直至SetEvent()被调用时为止。由于自动事件是由系统自动重置,故自动事件不需要调用该函数。

    如下程序计算1 到 1000000的素数的个数并打印出个数。 CEvent event; //定义个事件对象 void CThreadEventDlg::OnPrime() { // TODO: 在此添加命令处理程序代码 int n = 0; AfxBeginThread(Calculateprime, (LPVOID)&n, THREAD_PRIORITY_BELOW_NORMAL, 0); event.Lock(); //检测事件的发生,当计算线程计算完成后,SetEvent()将信号设为有信号后,才可打印 CString str; str.Format(_T("The Prime Numbers from 1 to 1000000 is %d"), n); AfxMessageBox(str);//输出素数的个数 event.Unlock(); //将事件对象恢复为无信号状态 } UINT Calculateprime(LPVOID pParam) { int* n = (int*)pParam; long m, k, i; for (m = 1; m <= 1000000; m = m + 2) { k = (long)sqrt((double)m); for (i = 2; i <= k; i++) { if (0 == m %i) { break; } } if (i >= k + 1) { *n = *n + 1; } } event.SetEvent(); //将事件对象激活 return 0; }

    转载请注明原文地址: https://ju.6miu.com/read-676314.html

    最新回复(0)