Windows API CreateEvent函数用法

CreateEvent是创建windows事件对象,作用主要用在判断线程退出和锁定方面.

HANDLE CreateEvent( 

 LPSECURITY_ATTRIBUTES
lpEventAttributes
,
// SD 

  BOOL
bManualReset
,
// reset type 

  BOOL
bInitialState
,
// initial state 

  LPCTSTR
lpName
// object name);

参数说明:

lpEventAttributes:

[输入]一个指向SECURITY_ATTRIBUTES结构的指针,确定返回的句柄是否可被子进程继承。如果lpEventAttributes是NULL,此句柄不能被继承。

Windows NT/2000:lpEventAttributes的结构中的成员为新的事件指定了一个安全符。如果lpEventAttributes是NULL,事件将获得一个默认的安全符。

bManualReset:

[输入]指定将事件对象创建成手动复原还是自动复原。如果是TRUE,那么必须用ResetEvent函数来手工将事件的状态复原到无信号状态。如果设置为FALSE,当事件被一个等待线程释放以后,系统将会自动将事件状态复原为无信号状态。

bInitialState:

[输入]指定事件对象的初始状态。如果为TRUE,初始状态为有信号状态;否则为无信号状态。

lpName:

[输入]指定事件的对象的名称,是一个以0结束的字符串指针。名称的字符格式限定在MAX_PATH之内。名字是对大小写敏感的。

如果lpName指定的名字,与一个存在的命名的事件对象的名称相同,函数将请求EVENT_ALL_ACCESS来访问存在的对象。这时候,由于 bManualReset和bInitialState参数已经在创建事件的进程中设置,这两个参数将被忽略。如果lpEventAttributes是参数不是NULL,它将确定此句柄是否可以被继承,但是其安全描述符成员将被忽略。

如果lpName为NULL,将创建一个无名的事件对象。

如果lpName的和一个存在的信号、互斥、等待计时器、作业或者是文件映射对象名称相同,函数将会失败,在GetLastError函数中将返回ERROR_INVALID_HANDLE。造成这种现象的原因是这些对象共享同一个命名空间。

以火车票订票系统为例:

// CreateEvent.cpp : 定义控制台应用程序的入口点。
//

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

DWORD WINAPI Fun1Proc (LPVOID lpParameter);
DWORD WINAPI Fun2Proc (LPVOID lpParameter);

int tickets=100;
HANDLE g_hEvent;

void main()
{
	HANDLE hThread1,hThread2;
	HANDLE g_hEvent1;
	g_hEvent1=CreateEvent(NULL,FALSE,FALSE,_T("tickets"));   //让应用程序只能有一个实例
	if(g_hEvent1)
	{
		if(ERROR_ALREADY_EXISTS==GetLastError())
		{
			cout<<"only one instance can run !"<<endl;
			return;
		}
	}

	g_hEvent=CreateEvent(NULL,FALSE,TRUE,NULL);  //创建自动重置事件内核对象,非信号状态
	hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
	hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
	CloseHandle(hThread1);               //关闭句柄没有终止线程,标示主线程对新线程的引用不感兴趣,引用计数减1
	CloseHandle(hThread2);

	//SetEvent(g_hEvent);

	Sleep(4000);
	CloseHandle(g_hEvent);

	system("pause");
}

DWORD WINAPI Fun1Proc(LPVOID lpParameter)  //当引用计数为0时,终止线程
{

	while (TRUE)
	{
		WaitForSingleObject(g_hEvent,INFINITE);
		//ResetEvent(g_hEvent);
		if (tickets>0)
		{
			Sleep(1);
			cout<<"thread1 sell tickes :"<<tickets--<<endl;
		}
		else
		{

			break;
		}
		//ResetEvent(g_hEvent);
		SetEvent(g_hEvent);
	}
	return 0;
}
DWORD WINAPI Fun2Proc (LPVOID lpParameter)
{
	while (TRUE)
	{
		WaitForSingleObject(g_hEvent,INFINITE);
		//ResetEvent(g_hEvent);

		if (tickets>0)
		{

			cout<<"thread2 sell tickes :"<<tickets--<<endl;
		}
		else
		{

			break;
		}
		//ResetEvent(g_hEvent);
		SetEvent(g_hEvent);
	}

	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-14 02:10:59

Windows API CreateEvent函数用法的相关文章

使用IDA PRO+OllyDbg+PEview 追踪windows API 动态链接库函数的调用过程

http://bbs.pediy.com/showthread.php?p=1354999 标 题: [原创]使用IDA PRO+OllyDbg+PEview 追踪windows API 动态链接库函数的调用过程.作 者: shayi时 间: 2015-02-12,05:19:54链 接: http://bbs.pediy.com/showthread.php?t=197829 使用IDA PRO+OllyDbg+PEview 追踪windows API 动态链接库函数的调用过程. (本文同步更

Windows API——CREATEEVENT——创建事件

事件是一个允许一个线程在某种情况发生时,唤醒另外一个线程的同步对象.事件告诉线程何时去执行某一给定的任务,从而使多个线程流平滑 CreateEvent是创建windows事件的意思,作用主要用在判断线程退出,线程锁定方面. HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes, // 安全属性 BOOL bManualReset, // 复位方式 BOOL bInitialState, // 初始状态 LPCTSTR lpName

Windows API常用函数

转自:http://www.cnblogs.com/xiashengwang/p/4026259.html .NET中虽然类库很强,但还是有些时候功能有限,掌握常用的api函数, 会给我们解决问题提供另一种思路. 1.SetForegroundWindow 将窗口显示到最前面,前提是窗口没有最小化. [DIIImport("User32.dll")] public static extern bool SetForegroundWindow(IntPtrh Wnd); 2.ShowWi

关于windows api我的一点点愚见

之前我一直对windows api命名和用法感到很困惑,但是经过一些实践后再看回<windows程序设计>,对windows api有了自己的一些看法 1.首先windows是闭源的,所以可能由于安全性,或者人为设计漏洞等可能原因,而导致windows有些api调用看起来方式很怪异. 例如windows会用句柄来表示资源,很多时候会存在获取句柄,然后传句柄给api,然后再释放句柄,个人感觉这个方法有点麻烦... 好吧,其实c函数的fopen这类的操作也是要自己调用fclose,这是无可避免的吗

WINDOWS API 函数(超长,值得学习)

一.隐藏和显示光标 函数: int ShowCursor ( BOOL bShow );  参数 bshow,为布尔型,bShow的值为False时隐藏光标,为True时显示光标:该函数的返回值为整型,为鼠标隐藏或显示的指数器:返回值大于等于0时显示光标,否则隐藏鼠标:如果安装了鼠标初值为0. 二.交换鼠标左右键和恢复 函数:BOOL SwapMouseButton ( BOOL fSwap );  参数 fSwap,为布尔型,TRUE表示交换鼠标左右键,FALSE表示恢复系统默认左右手习惯:返

WINDOWS API函数说明

Windows API函数大全,从事软件开发的朋友可以参考下 1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同一个网络资源的连接 WNetCancelConnection 结束一个网络连接 WNetCancelConnection2 结束一个网络连接 WNetCloseEnum 结束一次枚举操作 WNetConnectionDialog 启动一个

使用windows API函数获取目录下所有文件名---目录下文件的扫描和处理

直接上代码 // test_max.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <windows.h> #include <Shlwapi.h> #include <iostream> #include <string> #include <vector> #pragma comment(lib,"shlwapi.lib") //注意放置的位置

VBS调用windows api函数(postmessage)实现后台发送按键脚本

'=========================================================================='' VBScript Source File -- Created with SAPIEN Technologies PrimalScript 4.0'' NAME: '' AUTHOR: Microsoft , Microsoft' DATE : 2014/8/10'' COMMENT: ''===================定义变量,注册

windows API中CreateWindow()函数详解

CreateWindow函数详解 在注册完窗口类后就需要进行窗口的创建,用到的函数理所当然就是CreateWindow(), 而这个函数是基于窗口类的,所以还需要指定几个参数来制定特定的窗口.而且像一些不带边框的窗口是怎么创建的也是具有相当的技巧的,就是创建的是不带标题和边框的窗口,然后自己在客户区绘制程序的内容,能够制作个性化的应用程序. API解释 该函数创建一个重叠式窗口.弹出式窗口或子窗口.它指定窗口类,窗口标题,窗口风格,以及窗口的初始位置及大小(可选的).函数也指该窗口的父窗口或所属