Event是内核对象,他可以分为自动和手动两种模式。

HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes,
BOOL bManualReset,
BOOL bInitialState,
LPCTSTR lpName
);
参数
lpEventAttributes 安全属性。NULL 表示使用默认属性。该属性在
Windows 95中会被忽略。
bManualReset 如为FALSE,表示这个event 将在变成激发状态
(因而唤醒一个线程)之后,自动重置(reset)为
非激发状态。如果是TRUE,表示不会自动重置,
必须靠程序操作(调用ResetEvent())才能将激发
状态的event 重置为非激发状态。
bInitialState 如为TRUE,表示这个event 一开始处于激发状
态。如为FALSE,则表示这个event 一开始处于
非激发状态。
lpNameEvent 对象的名称。任何线程或进程都可以根据这
个文字名称,使用这一event 对象。
SetEvent()  把event  对象设为激发状态
ResetEvent() 把event 对象设为非激发状态(译注:在此我要提醒读者,
"Reset" 的意思是“设定为非激发状态”,而非“重新设定为
激发状态”。)
PulseEvent() 如果是一个 Manual Reset Event :把event 对象设为激发状
态,唤醒“所有”等待中的线程,然后event 恢复为非激发
状态。如果是一个Auto Reset Event:把event 对象设为激
发状态,唤醒“一个”等待中的线程,然后event 恢复为非
激发状态

下面做一个模拟实验,用两个线程轮流输出10次,当然哪个先开始也是可以控制的。

#pragma once
#include <Windows.h>
#include <iostream> using namespace std; class EventOption
{
public:
EventOption(void);
~EventOption(void);
void StartRnner();
void ReleaseOption();
private:
static DWORD WINAPI ThreadFunctionA(LPVOID param);
static DWORD WINAPI ThreadFunctionB(LPVOID param);
void FunctionA();
void FunctionB();
private:
HANDLE m_hThreadA;
HANDLE m_hThreadB;
HANDLE m_hEventA;
HANDLE m_hEventB;
}; #include "EventOption.h" EventOption::EventOption(void)
{
} EventOption::~EventOption(void)
{
}
// interface
void EventOption::StartRnner()
{
m_hEventA = CreateEvent(NULL, TRUE, FALSE, NULL);
m_hEventB = CreateEvent(NULL, TRUE, FALSE, NULL);
SetEvent(m_hEventA);
m_hThreadA = CreateThread(NULL, , ThreadFunctionA, this, , NULL);
m_hThreadB = CreateThread(NULL, , ThreadFunctionB, this, , NULL);
} void EventOption::ReleaseOption()
{
WaitForSingleObject(m_hThreadA, INFINITE);
WaitForSingleObject(m_hThreadB, INFINITE);
CloseHandle(m_hEventA);
CloseHandle(m_hEventB);
CloseHandle(m_hThreadA);
CloseHandle(m_hThreadB);
}
//private
DWORD EventOption::ThreadFunctionA(LPVOID param)
{
EventOption *pThis = (EventOption*)param;
pThis->FunctionA();
return ;
}
DWORD EventOption::ThreadFunctionB(LPVOID param)
{
EventOption *pThis = (EventOption*)param;
pThis->FunctionB();
return ;
} void EventOption::FunctionA()
{
int iCount = ;
while(iCount--)
{
WaitForSingleObject(m_hEventA, INFINITE);
cout<<"FunctionA: "<<iCount<<endl;
ResetEvent(m_hEventA);
SetEvent(m_hEventB);
}
} void EventOption::FunctionB()
{
int iCount = ;
while(iCount--)
{
WaitForSingleObject(m_hEventB, INFINITE);
cout<<"FunctionB: "<<iCount<<endl;
ResetEvent(m_hEventB);
SetEvent(m_hEventA);
}
} #include "EventOption.h"
int _tmain(int argc, _TCHAR* argv[])
{
EventOption test;
test.StartRnner();
test.ReleaseOption();
::getchar();
return ;
}

win32 多线程 (五)Event的更多相关文章

  1. Win32多线程编程(3) — 线程同步与通信

      一.线程间数据通信 系统从进程的地址空间中分配内存给线程栈使用.新线程与创建它的线程在相同的进程上下文中运行.因此,新线程可以访问进程内核对象的所有句柄.进程中的所有内存以及同一个进程中其他所有线 ...

  2. 深入浅出Win32多线程程序设计之基本概念

    一.深入浅出Win32多线程程序设计之基本概念[转] 引言 从单进程单线程到多进程多线程是操作系统发展的一种必然趋势,当年的DOS系统属于单任务操作系统,最优秀的程序员也只能通过驻留内存的方式实现所谓 ...

  3. win32多线程-异步过程调用(asynchronous Procedure Calls, APCs)

    使用overlapped I/O并搭配event对象-----win32多线程-异步(asynchronous) I/O事例,会产生两个基础性问题. 第一个问题是,使用WaitForMultipleO ...

  4. win32多线程-异步(asynchronous) I/O

    I/O设备是个慢速设备,无论打印机.调制解调器,甚至硬盘,与CPU相比都奇慢无比,坐下来干等I/O的完成是一件不甚明智事情. 异步(asynchronous) I/O在win32多线程程序设计中被称为 ...

  5. 多线程学习:win32多线程编程基本概念(转)

    一.定义: 1.进程和线程的区别 进程:是程序的执行过程,具有动态性,即运行的程序就叫进程,不运行就叫程序 ,每个进程包含一到多个线程.线程:系统中的最小执行单元,同一进程中有多个线程,线程可以共享资 ...

  6. win32多线程: 线程创建与结束等待

    #include<Windows.h> #include<iostream> using namespace std; /*1.在启动一个线程之前,必须为线程编写一个全局的线程 ...

  7. 由《win32多线程程序设计》临界区的问题所想

    之前看侯捷翻译的<win32多线程程序设计>中关于线程同步中的临界区问题,其中举得例子是对链表的操作.死锁的问题是对一个Swaplist函数的问题,现列举代码如下: void SwapLi ...

  8. Win32多线程编程(1) — 基础概念篇

      内核对象的基本概念 Windows系统是非开源的,它提供给我们的接口是用户模式的,即User-Mode API.当我们调用某个API时,需要从用户模式切换到内核模式的I/O System Serv ...

  9. Win32 多线程的创建方法和基本使用

    Win32多线程的创建方法主要有: (1)CreateThread() (2)_beginthread()&&_beginthreadex() (3)AfxBeginThread() ...

  10. win32多线程-重写消息循环

    最近正在学习<win32多线程程序设计>,这是其中一段重写消息循环的代码事例,以后可能用的上. while (!quit || gNumPrinting > 0) { // Wait ...

随机推荐

  1. 深入理解vsto,开发word插件的利器

    开发了vsto,客户那边也有一些反映插件安装失败或者加载不上的情况.于是我下定决定再理解下vsto的工作机制,如下图: 如上图所示,我把vsto的解决方案分为两部分,一部分是vsto Add-ins, ...

  2. Maven根据不同的环境打包不同的配置

    前言: 在开发过程中,我们的软件会面对不同的运行环境,比如开发环境.测试环境.生产环境,而我们的软件在不同的环境中,有的配置可能会不一样,比如数据源配置.日志文件配置等等. 那么就需要借助maven提 ...

  3. 2.2 web工程的目录结构

    [转] 一个最简单的Web应用的目录结构如下所示: Web应用的结构定义在Servlet的规范中,目前最新版本为3.1. 下载地址:https://jcp.org/aboutJava/communit ...

  4. Oracle 11G RAC:生产环境下架构

    转: it168网站  原创 作者:刘炳林 在真实环境搭建一套Oracle RAC就好比是一堂劳动课,劳动前需要准备好劳动工具,对劳动课内容有充分的认识;按照步骤一步一步进行,需要考虑劳动过程中可能遇 ...

  5. eclipse怎么在项目里面批量替换单词

    先选中你要替换的东东,然后再菜单栏中找到Search→Text→Project(先创建要搜索的project),这样就会在整个项目中查找单词.然后在Search的Console中,单击项目,右键选择R ...

  6. Ajax异步调用http接口后刷新页面

    使用Ajax的目的就是提高页面响应速度,无需同步调用,无需整个页面刷新.这里直接在html中使用js来实现: 先获取XMLHttpRequest对象 var xmlHttp; //创建一个xmlHtt ...

  7. SVN1.6服务端和客户端安装配置指导

    本节向大家描述SVN1.6服务端和客户端安装配置步骤,随着SVN的快速发展,版本也进行了升级更新,本节就和大家一起学习一下SVN1.6服务端和客户端安装配置步骤,欢迎大家一起来学习.下面是具体介绍.1 ...

  8. C++ 中的 new/delete 和 new[]/delete[]

    在 C++ 中,你也许经常使用 new 和 delete 来动态申请和释放内存,但你可曾想过以下问题呢? new 和 delete 是函数吗? new [] 和 delete [] 又是什么?什么时候 ...

  9. ssh-copy-id:/usr/bin/ssh-copy-id: ERROR: No identities found

    $ ssh-copy-id remote-machine 公钥,私钥已经生成,执行上述命令完毕出现如下错误: /usr/bin/ssh-copy-id: ERROR: No identities fo ...

  10. Studio 3T 如何使用 Query Builder 查询数据

    Studio 3T 是一款对 MongoDB 进行数据操作的可视化工具. 在 Studio 3T 中,我们可以借助 Query Builder 的 Drag & Drop 来构建查询条件. 具 ...