l线程中 CreateEvent 和 SetEvent及WaitForSingleObject的两种用法

本文详细介绍了Windows编程中事件对象(Event)的基本概念与使用方法。包括如何创建事件对象、使用SetEvent与ResetEvent函数改变事件状态,以及如何利用WaitForSingleObject函数等待事件。通过具体的编程实例,展示了不同情况下事件对象的应用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://www.cnblogs.com/MrYuan/p/5238749.html

CreateEvent

函功能描述:创建或打开一个命名的或无名的事件对象.

EVENT有两种状态:发信号,不发信号。 

SetEvent/ResetEvent分别将EVENT置为这两种状态分别是发信号与不发信号。 

WaitForSingleObject()等待,直到参数所指定的OBJECT成为发信号状态时才返回,OBJECT可以是EVENT,也可以是其它内核对象。

在这里举个例子:
先创建一个全局Event对象g_event:
CEvent g_event;
在程序中可以通过调用CEvent::SetEvent设置事件为有信号状态。
1.下面是一个线程函数MyThreadProc()
按 Ctrl+C 复制代码
UINT CFlushDlg::MyThreadProc( LPVOID pParam )
{
    WaitForSingleObject(g_event,INFINITE);
    For(;;)
    {
        ………….
    }
    return 0;
}
在这个线程函数中只有设置g_event为有信号状态时才执行下面的for循环,因为g_event是 全局变量,所以我们可以在别的线程中通过g_event. SetEvent控制这个线程。

2.还有一种用法就是我们可以通过WaitForSingleObject函数来间隔的执行一个线程函数的函数体
复制代码
UINT CFlushDlg::MyThreadProc( LPVOID pParam )
{
    while(WaitForSingleObject(g_event,MT_INTERVAL)!=WAIT_OBJECT_0)
    {
        //……
    }
    return 0;
}
复制代码
在这个线程函数中可以通过设置MT_INTERVAL来控制这个线程的 函数体多久执行一次,当事件为无信号状态时函数体隔MT_INTERVAL执行一次,当设置事件为有信号状态时,线程就执行完毕了。

区别:
 a. WaitForSingleObject(g_event,INFINITE)在没有 SetEvent(g_event),那么程序到WaitForSingleObject(g_event,INFINITE)会阻塞。

 b. WaitForSingleObject(g_event,MT_INTERVAL)(包括MT_INTERVAL==0的情况),使用 while (WaitForSingleObject(g_event,MT_INTERVAL)!= WAIT_OBJECT_0)不会被阻塞。


验证:
DWORD WINAPI CWaitForObjectDlg::procThread(LPVOID lpVoid)
{
	CWaitForObjectDlg *pThis = (CWaitForObjectDlg*)lpVoid;
	if (pThis == NULL)
		return 0;

	::CoInitialize(NULL);

	time_t t = time(NULL);
	double nSpan = 0;
	double nTime = 30;
	
	while (1)
	{

		if (WaitForSingleObject(pThis->m_hExitEvent, 0) == WAIT_OBJECT_0)
		{
			int a1= 0;
			//break;
		}

		WaitForSingleObject(pThis->m_hExitEvent,INFINITE);
		{
			int a2 = 0;
			//break;
		}

		int _c = 0;
			
	}
	return 0;
}

void CWaitForObjectDlg::OnBnClickedButtonResetevent()
{
	// TODO: 在此添加控件通知处理程序代码
	if (m_hExitEvent)
		SetEvent(m_hExitEvent);
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值