MFC 线程同步—— CEvent类

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值