MFC学习 事件临界区
事件:
#include <Windows.h>
#include <iostream>
DWORD WINAPI Func1Pro(LPVOID lpParameter);
DWORD WINAPI Func2Pro(LPVOID lpParameter);
int tickets = ;
HANDLE g_hEvent;
void main()
{ HANDLE hThread1;
HANDLE hThread2;
hThread1 = CreateThread(NULL, , Func1Pro, NULL, , NULL);
hThread2 = CreateThread(NULL, , Func2Pro, NULL, , NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);
// g_hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); //人工重置的事件对象, 初始信号状态设置为无信号状态
//g_hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); //自动重置事件对象, 初始信号状态设置为无信号状态
g_hEvent = CreateEvent(NULL, FALSE, FALSE, "tickets");
if(g_hEvent)
{
//带名字的事件对象也是系统唯一的, 可以判断实例
if(ERROR_ALREADY_EXISTS == GetLastError())
{
std::cout<< "only instance can run!" << std::endl;
return;
}
}
SetEvent(g_hEvent);//人工重置的事件对象, 会将所有线程的事件信号状态都改变 ResetEvent改成无信号
Sleep();
CloseHandle(g_hEvent);
}
DWORD WINAPI Func1Pro(LPVOID lpParameter)
{ while(TRUE)
{
WaitForSingleObject(g_hEvent, INFINITE); //如果是自动重置事件对象 处理时, 会改成非信号状态
if(tickets > )
{
Sleep();
std::cout << "thread1 sell ticket: " << tickets-- << std::endl;
}
else
break;
SetEvent(g_hEvent); //再设置为有信号状态
}
return ;
}
DWORD WINAPI Func2Pro(LPVOID lpParameter)
{ while(TRUE)
{
WaitForSingleObject(g_hEvent, INFINITE);//如果是自动重置事件对象 处理时, 会改成非信号状态
if(tickets > )
{
Sleep();
std::cout << "thread2 sell ticket: " << tickets-- << std::endl;
}
else
break;
SetEvent(g_hEvent); //再设置为有信号状态
}
return ;
}
临界区:
#include <Windows.h>
#include <iostream>
DWORD WINAPI Func1Pro(LPVOID lpParameter);
DWORD WINAPI Func2Pro(LPVOID lpParameter);
int tickets = ;
CRITICAL_SECTION g_cs;
void main()
{ HANDLE hThread1;
HANDLE hThread2;
hThread1 = CreateThread(NULL, , Func1Pro, NULL, , NULL);
hThread2 = CreateThread(NULL, , Func2Pro, NULL, , NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);
InitializeCriticalSection(&g_cs); //初始化临界区对象
Sleep();
DeleteCriticalSection(&g_cs);
}
DWORD WINAPI Func1Pro(LPVOID lpParameter)
{ while(TRUE)
{
EnterCriticalSection(&g_cs); //检查是否能进入临界区
if(tickets > )
{
Sleep();
std::cout << "thread1 sell ticket: " << tickets-- << std::endl;
}
else
break;
LeaveCriticalSection(&g_cs); }
return ;
}
DWORD WINAPI Func2Pro(LPVOID lpParameter)
{ while(TRUE)
{
EnterCriticalSection(&g_cs);
if(tickets > )
{
Sleep();
std::cout << "thread2 sell ticket: " << tickets-- << std::endl;
}
else
break;
LeaveCriticalSection(&g_cs);
}
return ;
}
MFC学习 事件临界区的更多相关文章
- MFC 学习之 鼠标移动到Toolbar按钮上显示提示信息(tooltip),状态栏也随之改变
1.在ResourceView里加入Toolbar资源,命名IDR_TOOLBAR1 2.在主程序的.h文件中加入变量: CToolBar m_toolbar;CImageList ...
- jQuery学习-事件之绑定事件(三)
在上一篇<jQuery学习-事件之绑定事件(二)>我们了解了jQuery的dispatch方法,今天我们来学习下handlers 方法: handlers: function( event ...
- jQuery学习-事件之绑定事件(二)
在上一篇<jQuery学习-事件之绑定事件(一)>我们了解了jQuery的add方法,今天我们来学习下dispatch方法: dispatch: function( event ) { ...
- MFC学习笔记1---准备工作
什么是MFC MFC,全称Microsoft Foundation Classes,微软基础类库,顾名思义,是微软的攻城狮们将一些常用的基础的Windows API 函数用C++的形式封装成类,简化程 ...
- MFC 学习笔记
MFC 学习笔记 一.MFC编程基础: 概述: 常用头文件: MFC控制台程序: MFC库程序: 规则库可以被各种程序所调用,扩展库只能被MFC程序调用. MFC窗口程序: 示例: MFC库中类的简介 ...
- MFC学习问题总结
1.学习MFC添加位图,无法获取其ID 1).点击视图->其他窗口->资源视图,你会发现“无法在此窗口显示”,找到resource.h文件,关闭即可重新走一遍上面的过程就会发现可以打开了. ...
- MFC学习笔记2---简单计算器
前言 学习了鸡啄米网页的前三部分后,我们就可以做一个小软件出来了,我选择先做一个计算器. 这是Win7系统自带的计算器: 为了提升成就感,我将计算器的大部分内容去除,于是就变成这样: 这样就只剩下了1 ...
- MFC学习笔记(一)
个人对MFC技术一直都很感兴趣,因为能够做出漂亮绚丽的界面应该是一件十分有成就感的事情. 学习的参考课本为北京博彦科技发展有限责任公司翻译的Jeff Prosise著的<MFC Windows程 ...
- 孙鑫MFC学习笔记16:异步套接字
16 1.事件对象 2.CreateEvent创建事件对象 3.SetEvent设置事件对象为通知状态 4.ResetEvent设置事件对象为非通知状态 5.InitializeCriticalSec ...
随机推荐
- ajax用户名案例(重点)
要求:失去焦点时如下效果 主页代码 <body> 用户名:<input type="text" id="a" /><div i ...
- MongoDB shell 格式化
直接的方法: db.collection.find().pretty(); 如果想要所有的查询都格式化,可以执行: echo "DBQuery.prototype._prettyShell ...
- HackerRank "Bike Racer"
Just for study from its editorial~ Lesson learnt: an optimized Hungarian Algorithm: Hopcroft-Karp Al ...
- SoPC/Qsys杂谈
1. 如果你想把Reset Vector放在EPCS Controller里面,记得将CPU core的Instruction Master和Data Master都连接到EPCS Controlle ...
- windows mobile 共享PC网络(win7)
win7系统安装windows mobile,将设备插入底座后,设备并不能直接共享pc的网络直接上网.原来,当插入底座后,需要打开mobile设备中心,切换一下连接网络,或者打开此窗体后确定一下,即可 ...
- windows mobile仿真器内存调整
1.打开VS,进入工具,选项. 2.点击设备,在右侧选中要调整的模拟器,点属性. 3.点击仿真器选项. 4.勾选 指定RAM大小. 5.重启仿真管理器.
- Oracle-单表合并列
表基本结构 合并列 select t.student,decode(t.java,'','','java') 科目, t.java from student t union select t.stud ...
- HTTP协议的安全性--全站HTTPS
HTTP Basic Authentication很容易让攻击者监听并获取用户名密码.使用Base64来encode用户名密码也只是为将用户名和口令中的不兼容字符转换为均与HTTP协议兼容的字符集. ...
- [CSS]如何正确使用ID和Class?
作者:DarkZone链接:https://www.zhihu.com/question/19550864/answer/23440690来源:知乎 以下摘自<精通CSS:高级Web标准解决方案 ...
- 在编译oc中protocol时出现的错误
Command /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang ...