win32 多线程 (五)Event
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的更多相关文章
- Win32多线程编程(3) — 线程同步与通信
一.线程间数据通信 系统从进程的地址空间中分配内存给线程栈使用.新线程与创建它的线程在相同的进程上下文中运行.因此,新线程可以访问进程内核对象的所有句柄.进程中的所有内存以及同一个进程中其他所有线 ...
- 深入浅出Win32多线程程序设计之基本概念
一.深入浅出Win32多线程程序设计之基本概念[转] 引言 从单进程单线程到多进程多线程是操作系统发展的一种必然趋势,当年的DOS系统属于单任务操作系统,最优秀的程序员也只能通过驻留内存的方式实现所谓 ...
- win32多线程-异步过程调用(asynchronous Procedure Calls, APCs)
使用overlapped I/O并搭配event对象-----win32多线程-异步(asynchronous) I/O事例,会产生两个基础性问题. 第一个问题是,使用WaitForMultipleO ...
- win32多线程-异步(asynchronous) I/O
I/O设备是个慢速设备,无论打印机.调制解调器,甚至硬盘,与CPU相比都奇慢无比,坐下来干等I/O的完成是一件不甚明智事情. 异步(asynchronous) I/O在win32多线程程序设计中被称为 ...
- 多线程学习:win32多线程编程基本概念(转)
一.定义: 1.进程和线程的区别 进程:是程序的执行过程,具有动态性,即运行的程序就叫进程,不运行就叫程序 ,每个进程包含一到多个线程.线程:系统中的最小执行单元,同一进程中有多个线程,线程可以共享资 ...
- win32多线程: 线程创建与结束等待
#include<Windows.h> #include<iostream> using namespace std; /*1.在启动一个线程之前,必须为线程编写一个全局的线程 ...
- 由《win32多线程程序设计》临界区的问题所想
之前看侯捷翻译的<win32多线程程序设计>中关于线程同步中的临界区问题,其中举得例子是对链表的操作.死锁的问题是对一个Swaplist函数的问题,现列举代码如下: void SwapLi ...
- Win32多线程编程(1) — 基础概念篇
内核对象的基本概念 Windows系统是非开源的,它提供给我们的接口是用户模式的,即User-Mode API.当我们调用某个API时,需要从用户模式切换到内核模式的I/O System Serv ...
- Win32 多线程的创建方法和基本使用
Win32多线程的创建方法主要有: (1)CreateThread() (2)_beginthread()&&_beginthreadex() (3)AfxBeginThread() ...
- win32多线程-重写消息循环
最近正在学习<win32多线程程序设计>,这是其中一段重写消息循环的代码事例,以后可能用的上. while (!quit || gNumPrinting > 0) { // Wait ...
随机推荐
- docker -ce(社区免费版)
Docker -ce https://www.cnblogs.com/zhangxiaoyong/p/9706392.html Docker 是世界领先的软件容器平台.开发人员利用 Docker 可以 ...
- RESTful处理JSON
@RequestMapping(value = "/dblist", method = RequestMethod.GET) @ResponseBody public Map< ...
- IDC单IP绑定多域名(包括端口)
本文件已上传到文件列表中. ServerName 222.186.36.116:80 DocumentRoot "/home" <Directory "/home& ...
- STM32从boot跳转到app失败
现象:在每次boot执行完跳转到APP时,都会跑飞 原因:在boot中使用到了USART和TIM,boot执行完没有关闭总中断 方法:在boot执行完跳转之前关闭中断,__disable_irq() ...
- 1020. Tree Traversals (25) ——树的遍历
//题目 通过后续遍历 中序遍历 得出一棵树 ,然后按树的层次遍历打印 PS:以前对于这种用指针的题目是比较头痛的,现在做了一些链表操作后,感觉也不难 先通过后续中序建一棵树,然后通过BFS遍历这棵树 ...
- Win7旗舰版一直显示检查更新的问题
最近部门机器从新安装win7 64位 旗舰版之后,每次检查更新,都会一直卡在检查更新的界面过不去,上网搜了一下,看到了网友提供的解决办法, 测试了一下,果然可以.记录下来,以备后用: 到微软官网去下载 ...
- erlang热部署
以下流程参考rebar的wiki,亲测 rebar的版本一定要注意,高版本对于下面两个指令有bug rebar generate-appups rebar generate-upgrade 经过一个个 ...
- mysql事务之一:MySQL数据库事务隔离级别(Transaction Isolation Level)及锁的实现原理
一.数据库隔离级别 数据库隔离级别有四种,应用<高性能mysql>一书中的说明: 然后说说修改事务隔离级别的方法: 1.全局修改,修改mysql.ini配置文件,在最后加上 1 #可选参数 ...
- Java-Runoob-高级教程:Java MySQL 连接
ylbtech-Java-Runoob-高级教程:Java MySQL 连接 1.返回顶部 1. Java MySQL 连接 本章节我们为大家介绍 Java 如何使用 使用 JDBC 连接 MySQL ...
- thinkphp中的验证码的实现
1.php端生成验证码函数 public function verify(){ // 验证码 import("@.Util.Image"); Image::buildImageVe ...