Event — Windows API
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的更多相关文章
- Windows API Hooking in Python
catalogue . 相关基础知识 . Deviare API Hook Overview . 使用ctypes调用Windows API . pydbg . winappdbg . dll inj ...
- Windows api 函数全部列表 (未完成)
网上找了很久,发现没有完整版的,msdn上面有,但是不方便查阅,所以想自己整理一下:由于工程量过于庞大,希望大家共同完成.MSDN:http://msdn.microsoft.com/en-us/li ...
- C++开发与Windows API
Windows API 向 C++ 开发人员提出了一项挑战. 组成 API 的众多库大都表现为 C 语言风格的函数和句柄或是 COM 风格的接口. 这些用起来都不太方便,需要进行一定的封装或间接操作. ...
- Qt 事件系统浅析 (用 Windows API 描述,分析了QCoreApplication::exec()和QEventLoop::exec的源码)(比起新号槽,事件机制是更高级的抽象,拥有更多特性,比如 accept/ignore,filter,还是实现状态机等高级 API 的基础)
事件系统在 Qt 中扮演了十分重要的角色,不仅 GUI 的方方面面需要使用到事件系统,Signals/Slots 技术也离不开事件系统(多线程间).我们本文中暂且不描述 GUI 中的一些特殊情况,来说 ...
- [Windows] Windows API 串口通信
Windows 中通过Windows API 进行串口通信主要有以下步骤: 打开串口 配置串口 读写串口 关闭串口 打开串口 关键API: CreateFile Windows 中进行设备的操作,第一 ...
- C# Windows API
API:应用程序接口(API:Application Program Interface)应用程序接口(API:application programming interface)是一组定义.程序及协 ...
- Windows API 函数列表 附帮助手册
所有Windows API函数列表,为了方便查询,也为了大家查找,所以整理一下贡献出来了. 帮助手册:700多个Windows API的函数手册 免费下载 API之网络函数 API之消息函数 API之 ...
- 初识【Windows API】--文本去重
最近学习操作系统中,老师布置了一个作业,运用系统调用函数删除文件夹下两个重复文本类文件,Linux玩不动,于是就只能在Windows下进行了. 看了一下介绍Windows API的博客: 点击打开 基 ...
- C#调用windows API的一些方法
使用C#调用windows API(从其它地方总结来的,以备查询) C#调用windows API也可以叫做C#如何直接调用非托管代码,通常有2种方法: 1. 直接调用从 DLL 导出的函数. 2. ...
随机推荐
- ubuntu 配置android开发环境
本文的下载地址都是androiddevtools,下载地址:http://www.androiddevtools.cn/ 一.安装android sdk 解压文件,全部放到/opt/Java/andr ...
- Linux下进程间管道通信小作业
在进行这次作业之前,我们先来看看什么是管道吧! 管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入,常说的管道多是指无名管道,无名管道只能用于具有亲缘关系的进程之间, ...
- jsp页面可以巧用模态框
jsp页面使用模态框配合ajax出来的效果真的没话说,当然你也可以使用模态框配合action,但是在删除和更新的时候传值有点麻烦,用ajax 就没有这些问题 ,比如删除代码的时候在js文件中传值可以这 ...
- 用ASP.net判断上传文件类型的三种方法
一. 安全性比较低,把文本文件1.txt改成1.jpg照样可以上传,但其实现方法容易理解,实现也简单,所以网上很多还是采取这种方法. Boolean fileOk = false; ...
- Python os常用模块
Python的标准库中的os模块包含普遍的操作系统功能.如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的.即它允许一个程序在编写后不需要任何改动,也不会发生任何问题,就可以在Linux和Wi ...
- oracle查询表信息(索引,外键,列等)
oracle中查询表的信息,包括表名,字段名,字段类型,主键,外键唯一性约束信息,索引信息查询SQL如下,希望对大家有所帮助:1.查询出所有的用户表 select * from user_tables ...
- 重新开始学习javase_Exception
“违例”(Exception)这个词表达的是一种“例外”情况,亦即正常情况之外的一种“异常”.在问题发生的时候,我们可能不知具体该如何解决,但肯定知道已不能不顾一切地继续下去.此时,必须坚决地停下来, ...
- 【USACO 1.3.4】牛式
[題目描述 ] 下面是一个乘法竖式,如果用我们给定的那n个数字来取代*,可以使式子成立的话,我们就叫这个式子牛式. * * * x * * ---------- * * * * * * ------- ...
- Get URL parameters & values with jQuery
原文: http://jquery-howto.blogspot.jp/2009/09/get-url-parameters-values-with-jquery.html In this post, ...
- sae crop 文档
原文是google缓存:http://webcache.googleusercontent.com/search?q=cache:MD_FP-G6RI8J:sae.sina.com.cn/%3Fm%3 ...