多线程-事件

创建  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++深入详解》

 

时间: 2024-12-26 19:01:41

多线程-事件的相关文章

Python多线程-事件

线程事件用于线程控制线程,线程事件的初始值为False set:将线程事件的值设为True clear:将线程事件的值设为False # -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" import threading import time event = threading.Event() def MyEvent(): count = 1 event.set() while True: if count >5 and coun

Python基础之多线程事件Event

import threading,time class Boss(threading.Thread): def run(self): print("BOSS:伙计们今晚上加班到22:00") event.set() time.sleep(5) #模拟一个小时这段时间 print("BOSS:22:00了可以下班了") event.set() class Worker(threading.Thread): def run(self): event.wait() #等待

多线程事件

import time import random from threading import Thread,Event def conn_db(e): count = 0 while count < 3: e.wait(1) if e.is_set(): print("连接数据库成功") break else: count += 1 print("第{}次连接数据库失败".format(count)) else: raise TimeoutError(&qu

[02]WPF异步响应,自定义事件、委托——多线程处理

题记 在编写有GUI的程序时,会遇到这样一种情形:用户点击了一个按钮,程序处理这个事件,然而这个处理过程耗时间较长.我们不想让软件卡在这里,而是让用户可以继续使用其他的软件功能.这种问题可以用多线程的事件响应来解决.这里,我就WPF的多线程事件响应做一个简单的归纳. 一.简单的异步的事件响应 在WPF中,针对简单的多线程处理过程,我们可以使用.NET自带的BackgroundWork完成.BackgroundWork的处理过程就是异步的,不会让用户界面停止响应. using System.Com

c#多线程总结(纯干货)

线程基础 创建线程 static void Main(string[] args) { Thread t = new Thread(PrintNumbers); t.Start();//线程开始执行 PrintNumbers(); Console.ReadKey(); } static void PrintNumbers() { Console.WriteLine("Starting..."); for (int i = 1; i < 10; i++) { Console.Wri

Netty 5用户指南

Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能.高可靠性的网络服务器和客户端程序.换句话说,Netty是一个NIO框架,使用它可以简单快速地开发网络应用程序,比如客户端和服务端的协议.Netty大大简化了网络程序的开发过程比如TCP和UDP的 Socket的开发. "快速和简单"并不意味着应用程序会有难维护和性能低的问题,Netty是一个精心设计的框架,它从许多协议的实现中吸收了很多的经验比如FTP.SMTP.HTTP.许多二进制和基于文本的传统协议,Netty在不

Netty 实现 WebSocket 聊天功能

准备 JDK 7+ Maven 3.2.x Netty 4.x Eclipse 4.x WebSocket WebSocket 通过"Upgrade handshake(升级握手)"从标准的 HTTP 或HTTPS 协议转为 WebSocket.因此,使用 WebSocket 的应用程序将始终以 HTTP/S 开始,然后进行升级.在什么时候发生这种情况取决于具体的应用;它可以是在启动时,或当一个特定的 URL 被请求时. 在我们的应用中,当 URL 请求以"/ws"

Netty 实现聊天功能

Netty 是一个 Java NIO 客户端服务器框架,使用它可以快速简单地开发网络应用程序,比如服务器和客户端的协议.Netty 大大简化了网络程序的开发过程比如 TCP 和 UDP 的 socket 服务的开发.更多关于 Netty 的知识,可以参阅<Netty 4.x 用户指南>(https://github.com/waylau/netty-4-user-guide) 下面,就基于 Netty 快速实现一个聊天小程序. 准备 JDK 7+ Maven 3.2.x Netty 4.x E

alibaba的COBAR真是强大.

近好不容易抽空研究了下Cobar,感觉这个产品确实很不错(在文档方面比Amoeba强多了),特此推荐给大家.Cobar是阿里巴巴研发的关系型数据 的分布式处理系统,该产品成功替代了原先基于Oracle的数据存储方案,目前已经接管了3000+个MySQL数据库的schema,平均每天处理近 50亿次的SQL执行请求. 首先,使用Cobar的核心功能如下: 分布式: Cobar的分布式主要是通过将表放入不同的库来实现: 1. Cobar支持将一张表水平拆分成多份分别放入不同的库来实现表的水平拆分 2