多线程-事件

创建  CreateEvent

销毁  CloseHandle

事件变为有信号(可以使用信号)  SetEvent

事件变为无信号(不可以使用信号)  ResetEvent

事件的创建

HANDLECreateEvent(
 LPSECURITY_ATTRIBUTES  lpEventAttributes,
 BOOL  bManualReset,
 BOOL  bInitialState,
 LPCTSTR lpName
);

第一个参数表示安全控制,一般直接传入NULL。

第二个参数确定事件是手动置位还是自动置位,传入TRUE表示手动置位,传入FALSE表示自动置位。如果为自动置位,则对该事件调用WaitForSingleObject()后会自动调用ResetEvent()使事件变成未触发状态。打个小小比方,手动置位事件相当于教室门,教室门一旦打开(被触发),所以有人都可以进入直到老师去关上教室门(事件变成未触发)。自动置位事件就相当于医院里拍X光的房间门,门打开后只能进入一个人,这个人进去后会将门关上,其它人不能进入除非门重新被打开(事件重新被触发)。

第三个参数表示事件的初始状态,传入TRUR表示已触发。

第四个参数表示事件的名称,传入NULL表示匿名事件。

SetEvent

函数功能:触发事件

函数原型:BOOLSetEvent(HANDLEhEvent);

函数说明:每次触发后,必有一个或多个处于等待状态下的线程变成可调度状态。

ResetEvent

函数功能:将事件设为末触发

函数原型:BOOLResetEvent(HANDLEhEvent);

最后一个事件的清理与销毁

由于事件是内核对象,因此使用CloseHandle()就可以完成清理与销毁了。

#include<stdio.h>
#include<process.h>
#include<windows.h>

int tickets=50;
HANDLE g_Event;

DWORD WINAPI Fun1(VOID *lp)
{
	while(true)
	{
		WaitForSingleObject(g_Event,INFINITE);
		if(tickets>0)
		{
			printf("thread1 %d\n",tickets--);
			SetEvent(g_Event);
		}
		else
		{
			SetEvent(g_Event);
			break;
		}
	}
	return 0;
}

DWORD WINAPI Fun2(VOID *lp)
{
	while(true)
	{
		WaitForSingleObject(g_Event,INFINITE);
       if(tickets>0)
	   {
		   printf("thread2 %d\n",tickets--);
		   SetEvent(g_Event);
	   }
	   else 
	   {
		   SetEvent(g_Event);
		   break;
	   }
	}
	return 0;
}

int main()
{
	HANDLE handle1,handle2;
	g_Event=CreateEvent(NULL,FALSE,FALSE,NULL);
	SetEvent(g_Event);
	handle1=CreateThread(NULL,0,Fun1,NULL,0,NULL);
	handle2=CreateThread(NULL,0,Fun2,NULL,0,NULL);
    
    CloseHandle(handle1);
	CloseHandle(handle2);
	
	Sleep(4000);
	CloseHandle(g_Event);
	return 0;
}

参考:http://blog.csdn.net/morewindows/article/details/7445233

         《VC++深入详解》

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员互动联盟

Windows SDK编程基本框架

在Windows平台下,最常见最流行的编程就是MFC编程了,在网上可以搜索出大把的MFC编程相关的文章,今天我们来讨论另外一种windows下的编程模式,即W...

33213
来自专栏刘望舒

Android系统层Watchdog机制源码分析

一:为什么需要看门狗? Watchdog,初次见到这个词语是在大学的单片机书上, 谈到了看门狗定时器. 在很早以前那个单片机刚发展的时候, 单片机容易受到外界工...

2657
来自专栏技术沉淀

Rails资源

1282
来自专栏生信宝典

基因组分析中多物种同源基因的鉴定和筛选

OrthoMCL能做什么 Orthologs are homologs separated by speciation events. Paralogs are...

4187
来自专栏本立2道生

Win32对话框程序(1)

之前学C语言是一直都是在控制台下面操作的,面对的都是黑框框,严重的打击了学习的兴趣。后来在TC下进行C语言课程设计,做了图形界面编程,但都是点线面画的…… 

1841
来自专栏Java3y

【SSH测试整合Demo】企业人事管理系统

前言 前面我们已经学习了怎么整合SSH框架了。是时候拿一个小项目来练练手了….我们现在要设计一个企业人事管理系统… 需求: **要求对员工信息进行维护; ** ...

43113
来自专栏Android知识点总结

Android原生下载(上篇)基本逻辑+断点续传

1451
来自专栏NetCore

[原创]Fluent NHibernate之旅(四)-- 关系(上)

经过了前面三篇的介绍,相信大家对Fluent NHibernate已经有一定的了解了,在我们学习中,Fluent 也已经进入了RTM版本。这次的版本发布离RC版...

2206
来自专栏知识分享

4-MSP430定时器_定时器中断

一开始没写好就上传了,,,,,,,,这次来个全的 自己学MSP430是为了写一篇关于PID的文章,需要430在proteus上做仿真,一则认为在自动控制算法上P...

3656
来自专栏张善友的专栏

Windows 7上执行Cake 报错原因是Powershell 版本问题

在Windows 7 SP1 电脑上执行Cake的的例子 http://cakebuild.net/docs/tutorials/getting-started...

2279

扫码关注云+社区

领取腾讯云代金券