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; }