C++事件SetEvent,ResetEvent的使用

一、概念

创建事件:

HANDLE CreateEvent(

 LPSECURITY_ATTRIBUTES lpEventAttributes, // SECURITY_ATTRIBUTES结构指针,可为NULL
 BOOL bManualReset,     // 手动/自动
                                     // TRUE:表示手动,在WaitForSingleObject后必须手动调用ResetEvent清除信号
                                    // FALSE:表示自动,在WaitForSingleObject后,系统自动清除事件信号
 BOOL bInitialState,        //初始状态,FALSE为无信号,TRUE为有信号
 LPCTSTR lpName         //事件的名称
    );

 

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

可使用WaitForSingleObject或者WaitForMultipleObjects来等待事件。

二、代码实例

#include "stdafx.h"
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;

HANDLE h_event1 = NULL;
HANDLE h_event2 = NULL;
DWORD WINAPI FunProc1(LPVOID lpParameter);
DWORD WINAPI FunProc2(LPVOID lpParameter);

DWORD WINAPI FunProc1(LPVOID lpParameter)
{
	cout << "线程1开始运行。\n" << endl;
	while (WAIT_OBJECT_0 != WaitForSingleObject(h_event1, 300))
	{
		cout << "线程1正在等待event1\n" << endl;
	}
	cout << "线程1等到了event1,线程1结束。\n" << endl;
	ResetEvent(h_event1);
	return 0;
}

DWORD WINAPI FunProc2(LPVOID lpParameter)
{
	cout << "线程2开始运行。\n" << endl;
	while (WAIT_OBJECT_0 != WaitForSingleObject(h_event2, 300))
	{
		cout << "线程2正在等待event2\n" << endl;
	}
	cout << "线程2等到了event2,线程2结束。\n" << endl;
	Sleep(350);
	SetEvent(h_event1); 
	return 0;
}

int main(int argc, char** argv)
{
	h_event1 = CreateEvent(NULL, true, false, _T("event_one"));
	h_event2 = CreateEvent(NULL, false, false, _T("event_two"));

	HANDLE hThread1;
	hThread1 = CreateThread(NULL, 0, FunProc1, NULL, 0, NULL);

	HANDLE hThread2;
	hThread2 = CreateThread(NULL, 0, FunProc2, NULL, 0, NULL);

	Sleep(1000);
	SetEvent(h_event2);

	while (WaitForSingleObject(hThread1, 150) != WAIT_OBJECT_0 || WaitForSingleObject(hThread2, 150) != WAIT_OBJECT_0)
	{
		cout << "线程还没有结束,主程序等了150ms。\n" << endl;
	}

	CloseHandle(hThread1);
	CloseHandle(hThread2);
	CloseHandle(h_event1);
	CloseHandle(h_event2);

	system("pause");

}

在主函数中,创建了两个事件对象,h_event1与h_event2;其中h_event1第二个参数为true,表示其在WaitForSingleObject后必须手动调用ResetEvent清除信号,h_event1第二个参数为false,表示其在WaitForSingleObject后系统自动清除事件信号,两个事件对象创建时第三个参数都为false,表示初始都为无信号状态;

接下来启动两个线程,第一个线程的线程函数中每隔300ms查询一次h_event1的状态,直到h_event1为有信号停止,并将h_event1置为无信号状态;第一个线程的线程函数中每隔300ms查询一次h_event2的状态,直到h_event2为有信号停止,并在h_event2有信号之后在等待350ms之后将h_event1置为有信号状态;

主函数在启动两个线程之后等待1秒之后将h_event2置为有信号状态,此时两个线程都应已查询三次信号量状态并将等待情况输出,在h_event2有信号之后线程2会结束,并在等待350ms将事件1修改,在此期间线程1会再次查询,同时主函数会继续执行,再while循环中查询两个线程的状态,当两个并未都结束时每隔150ms输出一次信息。

最后程序运行结果:

 

 

这个例子代码其实写的很蠢,但应该比较容易看明白,写这篇文主要是因为我自己在网上查事件使用的时候,搜到的文章全是概念解释,偶尔有个例子也不详细,就自己随便写个记录一下。。。。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值