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. java.util.concurrent.atomic 类包详解

    java.util.concurrent包分成了三个部分,分别是java.util.concurrent.java.util.concurrent.atomic和java.util.concurren ...

  2. Android 用MediaCodec实现视频硬解码

    http://blog.csdn.net/halleyzhang3/article/details/11473961 http://www.360doc.com/content/14/0119/10/ ...

  3. Android MediaCodec 使用例子

    Android MediaCodec 使用例子 下面的例子是使用MediaCodec 录制到文件的例子. 1 public class AvcEncoder { private MediaCodec ...

  4. CSS实现背景透明而背景上的文字不透明完美解决

    在我们设计制作一些网页的时候可能会用到半透明的效果,首先我们可能会想到用PNG图片处理,当然这是一个不错的办法,唯一的兼容性问题就是ie6 下的BUG,但这也不困难,加上一段js处理就行了.但假如我们 ...

  5. myeclipse跟eclipse中使用github做版本控制工具

    今天早上花了一上午的时间,了解了在myeclipse跟eclipse中使用github. 好吧 说说怎么做的,让大伙少走一点路,我就简单描述下,需要软件的私信我 第一:下载git 第二:靠谱.但是pu ...

  6. jsp中的c标签

    核心标签库 引用: <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> ...

  7. c#中去掉字符串空格方法

    (1)Trim方法 string   tt=" aaa "; tt=tt.Trim()       去字符串首尾空格的函数 tt=tt.TrimEnd() 去掉字符串尾空格 tt= ...

  8. jquery动画总结

    基本动画 show() //直接显示元素,没有动画 show(speed, [callback]) //有动画,有回调函数 hide() //直接隐藏元素,没有动画 hide(speed, [call ...

  9. jQuery ajax - serialize() 方法

    http://www.jb51.net/article/60849.htm http://www.w3school.com.cn/jquery/ajax_serialize.asp

  10. word2vec生成词向量原理

    假设每个词对应一个词向量,假设: 1)两个词的相似度正比于对应词向量的乘积.即:$sim(v_1,v_2)=v_1\cdot v_2$.即点乘原则: 2)多个词$v_1\sim v_n$组成的一个上下 ...