Event即事件是一种用于进行线程/进程间同步的对象,事件有置位和复位两种状态,当线程通过waiting functions等待Event对象置位时该线程将进入阻塞状态,当该Event对象被置位或等待超时后,等待的线程将恢复执行。Event可以用在一个线程要等待其它线程时。

可以使用CreateEvent创建Event对象

HANDLE WINAPI CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes,
BOOL bManualReset,
BOOL bInitialState,
LPCTSTR lpName
);

lpEventAttributes用于指定Event对象的安全属性,包括句柄是否可被子进程继承和对象的安全描述符。可设置NULL取默认安全属性。
bManualReset表明Event对象是否需要手动复位。如果该参数为TRUE,则Event对象需要通过ResetEvent函数手动复位。如果该参数为FALSE,则Event被创建为自动复位的Event,任何等待的线程被恢复执行后,该Event将被系统自动复位。打个比方,如果有10个线程在等待一个Event,这时将Event置位,如果这是个手动复位Event,那么这10个线程将被依次唤醒直到通过ResetEvent调用将该Event复位;如果Event为自动复位Event,那么10个线程中的第一个被唤醒后Event被自动复位,其它线程将继续等待。
bInitialState参数表明Event对象被创建后默认是否置位。
lpName参数是Event的名字,可以为空表明将创建匿名Event。

CreateEvent函数在调用成功后返回Event句柄。如果同名Event已经存在,则返回这个已经存在了的Event的句柄,此时调用GetLastError函数将返回 ERROR_ALREADY_EXISTS。

还可以通过OpenEvent打开一个已经创建的非匿名Event

HANDLE WINAPI OpenEvent(
DWORD dwDesiredAccess,
BOOL bInheritHandle,
LPCTSTR lpName
);

在创建或打开了Event对象之后,可以使用SetEvent和ResetEvent函数来置位或复位一个Event对象。

BOOL WINAPI SetEvent(
HANDLE hEvent
);
BOOL WINAPI ResetEvent(
HANDLE hEvent
);

要等待一个或多个Event对象置位可以使用wait functions。

简单示例,一个线程不停读取用户输入并放入message列表,另一个线程模拟将message发送出去,如果没有消息,则发送线程处于阻塞状态等待,一旦有消息录入,输入线程将event置位,发送线程即被激活并逐个发送消息。

#include <windows.h>
#include <tchar.h>
#include <iostream>
#include <list>
#include <string>
using namespace std; #ifdef _UNICODE
typedef wstring tstring;
#define tcout wcout
#define tcin wcin
#else
typedef string tstring;
#define tcout cout
#define tcin cin
#endif /* _UNICODE */ typedef list<tstring> string_list; HANDLE mutex = NULL;
HANDLE event = NULL;
HANDLE sender_thread = NULL;
string_list messages; bool is_running; DWORD WINAPI sender_thread_proc(LPVOID lpThreadParameter) {
DWORD dw;
while (is_running) {
dw = WaitForSingleObject(event, INFINITE);
if (dw != WAIT_OBJECT_0) {
tcout << _T("Wait error.") << endl;
return -;
}
dw = WaitForSingleObject(mutex, INFINITE);
if (WAIT_OBJECT_0 != dw && WAIT_ABANDONED != dw) {
tcout << _T("Wait error.") << endl;
return -;
} string_list list(messages);
messages.clear(); ReleaseMutex(mutex); for (string_list::iterator i = list.begin(); i != list.end(); i++) {
Sleep(); //休眠1秒模拟发送所耗时间 tcout << _T("/* Send Message:") << *i << _T(" */");
} } return ;
} int _tmain(int argc, _TCHAR* argv[]) {
mutex = CreateMutex(NULL, FALSE, NULL);
event = CreateEvent(NULL, FALSE, FALSE, NULL);
is_running = true; sender_thread = CreateThread(NULL, , (LPTHREAD_START_ROUTINE) sender_thread_proc,
NULL, , NULL); while (is_running) {
tstring s;
tcin >> s;
if (s == _T("quit")) {
is_running = true;
break;
} DWORD dw = WaitForSingleObject(mutex, INFINITE);
if (WAIT_OBJECT_0 != dw && WAIT_ABANDONED != dw) {
tcout << _T("Wait error.") << endl;
return -;
}
messages.push_back(s);
ReleaseMutex(mutex);
SetEvent(event);
} CloseHandle(mutex);
CloseHandle(event);
CloseHandle(sender_thread); return ; }

Event — Windows API的更多相关文章

  1. Windows API Hooking in Python

    catalogue . 相关基础知识 . Deviare API Hook Overview . 使用ctypes调用Windows API . pydbg . winappdbg . dll inj ...

  2. Windows api 函数全部列表 (未完成)

    网上找了很久,发现没有完整版的,msdn上面有,但是不方便查阅,所以想自己整理一下:由于工程量过于庞大,希望大家共同完成.MSDN:http://msdn.microsoft.com/en-us/li ...

  3. C++开发与Windows API

    Windows API 向 C++ 开发人员提出了一项挑战. 组成 API 的众多库大都表现为 C 语言风格的函数和句柄或是 COM 风格的接口. 这些用起来都不太方便,需要进行一定的封装或间接操作. ...

  4. Qt 事件系统浅析 (用 Windows API 描述,分析了QCoreApplication::exec()和QEventLoop::exec的源码)(比起新号槽,事件机制是更高级的抽象,拥有更多特性,比如 accept/ignore,filter,还是实现状态机等高级 API 的基础)

    事件系统在 Qt 中扮演了十分重要的角色,不仅 GUI 的方方面面需要使用到事件系统,Signals/Slots 技术也离不开事件系统(多线程间).我们本文中暂且不描述 GUI 中的一些特殊情况,来说 ...

  5. [Windows] Windows API 串口通信

    Windows 中通过Windows API 进行串口通信主要有以下步骤: 打开串口 配置串口 读写串口 关闭串口 打开串口 关键API: CreateFile Windows 中进行设备的操作,第一 ...

  6. C# Windows API

    API:应用程序接口(API:Application Program Interface)应用程序接口(API:application programming interface)是一组定义.程序及协 ...

  7. Windows API 函数列表 附帮助手册

    所有Windows API函数列表,为了方便查询,也为了大家查找,所以整理一下贡献出来了. 帮助手册:700多个Windows API的函数手册 免费下载 API之网络函数 API之消息函数 API之 ...

  8. 初识【Windows API】--文本去重

    最近学习操作系统中,老师布置了一个作业,运用系统调用函数删除文件夹下两个重复文本类文件,Linux玩不动,于是就只能在Windows下进行了. 看了一下介绍Windows API的博客: 点击打开 基 ...

  9. C#调用windows API的一些方法

    使用C#调用windows API(从其它地方总结来的,以备查询) C#调用windows API也可以叫做C#如何直接调用非托管代码,通常有2种方法: 1.  直接调用从 DLL 导出的函数. 2. ...

随机推荐

  1. CDOJ 92 Journey(LCA&RMQ)

    题目连接:http://acm.uestc.edu.cn/#/problem/show/92 题意:给定一棵树,最后给加一条边,给定Q次查询,每次查询加上最后一条边之后是否比不加这条边要近,如果近的话 ...

  2. 谷歌插件postman如果不能用,就用git命令发送post请求

     curl -X POST --data '{"name":"zfpx"}' -H 'Content-Type:application/json' http:/ ...

  3. 未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序(Oledb)

    转载:http://blog.csdn.net/lemontec/article/details/1754413 前几天用c#读 Excel 出现了如下问题未在本地计算机上注册“Microsoft.J ...

  4. xls和xlsx

      xls XLS 就是 Microsoft Excel 工作表,是一种非常常用的电子表格格式.xls文件可以使用Microsoft Excel打开,另外微软为那些没有安装Excel的用户开发了专门的 ...

  5. Lock锁_线程_线程域

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  6. 三、改变struts.xml默认路径后web.xml如何配置

    http://yanln.iteye.com/blog/2189816(文章很好)

  7. [转] iOS开发- UICollectionView详解+实例

    本章通过先总体介绍UICollectionView及其常用方法,再结合一个实例,了解如何使用UICollectionView. UICollectionView 和 UICollectionViewC ...

  8. 02C#基础(1)

    1.关键字 C#中定义了很多关键字,关键字是构成C#基本语法的,不用去背,用的多就记住了 2.标识符 标识符是用来给类.方法.变量等命名的 命名规则:  (1)由字母.中文(不推荐).数字.下划线组成 ...

  9. 低字节序和高字节序相互转换(Little Endian/Big Endian)

    这个例子展示了如何转换整形数字的字节顺序,该方法可以用来在little-endian和big-endian之间转换. 说明:Windos(x86,x64)和Linux(x86,x64)都是little ...

  10. 【USACO 1.2.2】方块转换

    [问题描述] 一块N x N(1<=N<=10)正方形的黑白瓦片的图案要被转换成新的正方形图案.写一个程序来找出将原始图案按照以下列转换方法转换成新图案的最小方式: 1:转90度:图案按顺 ...