SetEvent与ResetEvent

事件(Event)是WIN32提供的最灵活的线程间同步方式,事件可以处于激发状态(signaled or true)或未激发状态(unsignal or false)。根据状态变迁方式的不同,事件可分为两类:
 

  (1)手动设置:这种对象只可能用程序手动设置,在需要该事件或者事件发生时,采用SetEvent及ResetEvent来进行设置。
  (2)自动恢复:一旦事件发生并被处理后,自动恢复到没有事件状态,不需要再次设置。
       参数1:SECURITY_ATTRIBUTES结构指针,可为NULL
       参数2:// 手动/自动
      // TRUE:在WaitForSingleObject后必须手动调用ResetEvent清除信号
      // FALSE:在WaitForSingleObject后,系统自动清除事件信号
       参数3://初始状态,是否发信号  ,false不发信号,true,发信号(返回值WaitForSingleObject(h_event1, 300)=WAIT_OBJECT_0)
       参数4://事件的名称

CreateEvent(NULL, true, false, _T("event_one"));

参考https://blog.csdn.net/LL596214569/article/details/89163734

简单得用法,SetEvent可以控制线程是否继续执行,或者卡死多少秒

使用CreateEvent,创建,WaitForSingleObject 方法卡死,

程序如下,如果输入0,SetEvent(h_event1);继续执行,

输入1,卡死在程序中WaitForSingleObject ,等待3秒,执行一下继续卡死

代码如下:


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

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


DWORD WINAPI FunProc1(LPVOID lpParameter)
{
	cout << "线程1开始运行。\n" << endl;
	while (true) {
		while (WAIT_TIMEOUT == WaitForSingleObject(h_event1, 3000))
		{
			cout << "线程1event1等待超时\n" << endl;
			Sleep(500);
		}
		cout << "线程1等到了event1,线程1结束。\n" << endl;
		Sleep(500);
	}
	return 0;
}



int main(int argc, char** argv)
{
	/* 事件(Event)是WIN32提供的最灵活的线程间同步方式,事件可以处于激发状态(signaled or true)或未激发状态(unsignal or false)。根据状态变迁方式的不同,事件可分为两类:
  (1)手动设置:这种对象只可能用程序手动设置,在需要该事件或者事件发生时,采用SetEvent及ResetEvent来进行设置。
  (2)自动恢复:一旦事件发生并被处理后,自动恢复到没有事件状态,不需要再次设置。
       参数1:SECURITY_ATTRIBUTES结构指针,可为NULL
       参数2:// 手动/自动
      // TRUE:在WaitForSingleObject后必须手动调用ResetEvent清除信号
      // FALSE:在WaitForSingleObject后,系统自动清除事件信号
       参数3://初始状态,是否发信号  ,false不发信号,true,发信号(返回值WaitForSingleObject(h_event1, 300)=WAIT_OBJECT_0)
       参数4://事件的名称
    */
	h_event1 = CreateEvent(NULL, true, true, _T("event_one"));


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




	string  a = "";
	
	while (true) {
		cin >> a;
		if (a == "1") {
			ResetEvent(h_event1);
		}
		else {
			SetEvent(h_event1);
		}
	}

	CloseHandle(hThread1);
	CloseHandle(h_event1);


	system("pause");

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值