windows C/C++ 内核对象、事件对象、信号量
承接上一篇:https://blog.csdn.net/uVarAndMethod/article/details/90360838
1、内核对象: 进程、线程、文件、文件映射、事件、互斥体等等 2、事件内核对象的创建 HANDLE g_hEvent = CreateEvent(NULL, TRUE, FALSE, "XYZ"); HANDLE g_hMutex = CreateMutex(NULL,FALSE, "XYZ"); 3、事件内核对象的获取 HANDLE OpenEvent( DWORD dwDesiredAccess, // access BOOL bInheritHandle, // inheritance option LPCTSTR lpName // object name ); HANDLE g_hEvent = OpenEvent(EVENT_ALL_ACCESS, FALSE, "XYZ"); HANDLE g_hMutex = OpenMutex(MUTEX_ALL_ACCESS,FALSE, "XYZ"); 4、内核对象的销毁 BOOL CloseHandle(HANDLE hobj); (1)、当没有其他程序引用时,系统会销毁内核对象(使用数量). (2)、内核对象的生命周期,可能比创建它的对象要长. 5、内核对象的生命周期 eg:CloseHandle()/进程结束 进程一: HANDLE g_hEvent = CreateEvent(NULL, TRUE, FALSE, "XYZ"); SetEvent(g_hEvent); 进程二: HANDLE g_hEvent = OpenEvent(EVENT_ALL_ACCESS, FALSE, "XYZ"); WaitForSingleObject(g_hEvent, INFINITE); eg:内核对象的生命周期 进程一: HANDLE g_hEvent = CreateEvent(NULL, TRUE, FALSE, "XYZ"); SetEvent(g_hEvent); 进程二: HANDLE g_hEvent = OpenEvent(EVENT_ALL_ACCESS, FALSE, "XYZ"); WaitForSingleObject(g_hEvent, INFINITE);
///
1、事件对象的创建
HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes, // 安全属性 NULL时为系统默认 BOOL bManualReset, // TRUE 通过调用ResetEvent将事件对象标记为未通知 BOOL bInitialState, // TRUE 已通知状态 FALSE未通知状态 LPCTSTR lpName // 对象名称 以NULL结尾的字符串
); 2、事件对象的控制
BOOL SetEvent(HANDLE hEvent); //将对象设置为已通知 3、关闭时间对象句柄 //关闭句柄
CloseHandle(); 4、线程控制实验:只读形式的线程控制
HANDLE g_hEvent; HWND hEdit1;
HWND hEdit2;
HWND hEdit3;
HWND hEdit4;
HANDLE hThread1;
HANDLE hThread2;
HANDLE hThread3;
HANDLE hThread4; DWORD WINAPI ThreadProc1(LPVOID lpParameter)
{ //创建事件 //默认安全属性 手动设置未通知状态(TRUE) 初始状态未通知 没有名字 g_hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); HANDLE hThread[3]; //创建3个线程 hThread[0] = ::CreateThread(NULL, 0, ThreadProc2, NULL, 0, NULL); hThread[1] = ::CreateThread(NULL, 0, ThreadProc3, NULL, 0, NULL); hThread[2] = ::CreateThread(NULL, 0, ThreadProc4, NULL, 0, NULL); //设置文本框的值 SetWindowText(hEdit1,"1000"); //设置事件为已通知 SetEvent(g_hEvent); //等待线程结束 销毁内核对象 WaitForMultipleObjects(3, hThread, TRUE, INFINITE); CloseHandle(hThread[0]); CloseHandle(hThread[1]); CloseHandle(hThread[2]); CloseHandle(g_hEvent); return 0;
} DWORD WINAPI ThreadProc2(LPVOID lpParameter)
{ TCHAR szBuffer[10] = {0}; //当事件变成已通知时 WaitForSingleObject(g_hEvent, INFINITE); //读取内容 GetWindowText(hEdit1,szBuffer,10); SetWindowText(hEdit2,szBuffer); return 0;
}
DWORD WINAPI ThreadProc3(LPVOID lpParameter)
{ TCHAR szBuffer[10] = {0}; //当事件变成已通知时 WaitForSingleObject(g_hEvent, INFINITE); //读取内容 GetWindowText(hEdit1,szBuffer,10); SetWindowText(hEdit3,szBuffer); return 0;
}
DWORD WINAPI ThreadProc4(LPVOID lpParameter)
{ TCHAR szBuffer[10] = {0}; //当事件变成已通知时 WaitForSingleObject(g_hEvent, INFINITE); //读取内容 GetWindowText(hEdit1,szBuffer,10); SetWindowText(hEdit4,szBuffer); return 0;
} 创建信号量 HANDLE CreateSemaphore( LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LONG lInitialCount, LONG lMaximumCount, LPCTSTR lpName ); 函数说明: 第一个参数表示安全控制,一般直接传入NULL。 第二个参数表示初始资源数量。0时不发送信号 第三个参数表示最大并发数量。lInitialCount<=lMaximumCount 第四个参数表示信号量的名称,传入NULL表示匿名信号量。 打开信号量 HANDLE OpenSemaphore( DWORD dwDesiredAccess, BOOL bInheritHandle, LPCTSTR lpName ); 函数说明: 第一个参数表示访问权限,对一般传入SEMAPHORE_ALL_ACCESS。详细解释可以查看MSDN文档。 第二个参数表示信号量句柄继承性,一般传入FALSE即可。 第三个参数表示名称,不同进程中的各线程可以通过名称来确保它们访问同一个信号量。 递增信号量的当前资源计数 BOOL ReleaseSemaphore( HANDLE hSemaphore, LONG lReleaseCount, LPLONG lpPreviousCount ); 函数说明: 第一个参数是信号量的句柄。 第二个参数表示增加个数,必须大于0且不超过最大资源数量。 第三个参数返回当前资源数量的原始值,设为NULL表示不需要传出。 注:没有一个函数可以用来查询信标的当前资源数量的值 信号量的清理与销毁 CloseHandle() 通过信号量控制对资源的访问: 见MSDN eg:信号量应用 #include "stdafx.h" #include "resource.h" HANDLE hSemaphore; HANDLE hThread[3]; HWND hEditSet; HWND hEdit1; HWND hEdit2; HWND hEdit3; DWORD WINAPI ThreadProc1(LPVOID lpParameter) { TCHAR szBuffer[10]; DWORD dwTimmer=0; WaitForSingleObject(hSemaphore, INFINITE); while(dwTimmer<100) { Sleep(100); memset(szBuffer,0,10); GetWindowText(hEdit1,szBuffer,10); sscanf( szBuffer, "%d", &dwTimmer ); dwTimmer++; memset(szBuffer,0,10); sprintf(szBuffer,"%d",dwTimmer); SetWindowText(hEdit1,szBuffer); } ReleaseSemaphore(hSemaphore, 1, NULL); return 0; } DWORD WINAPI ThreadProc2(LPVOID lpParameter) { TCHAR szBuffer[10]; DWORD dwTimmer=0; WaitForSingleObject(hSemaphore, INFINITE); while(dwTimmer<100) { Sleep(100); memset(szBuffer,0,10); GetWindowText(hEdit2,szBuffer,10); sscanf( szBuffer, "%d", &dwTimmer ); dwTimmer++; memset(szBuffer,0,10); sprintf(szBuffer,"%d",dwTimmer); SetWindowText(hEdit2,szBuffer); } ReleaseSemaphore(hSemaphore, 1, NULL); return 0; } DWORD WINAPI ThreadProc3(LPVOID lpParameter) { TCHAR szBuffer[10]; DWORD dwTimmer=0; WaitForSingleObject(hSemaphore, INFINITE); while(dwTimmer<100) { Sleep(100); memset(szBuffer,0,10); GetWindowText(hEdit3,szBuffer,10); sscanf( szBuffer, "%d", &dwTimmer ); dwTimmer++; memset(szBuffer,0,10); sprintf(szBuffer,"%d",dwTimmer); SetWindowText(hEdit3,szBuffer); } ReleaseSemaphore(hSemaphore, 1, NULL); return 0; } DWORD WINAPI ThreadBegin(LPVOID lpParameter) { TCHAR szBuffer[10]; DWORD dwMoney=0; hSemaphore = CreateSemaphore(NULL,0,3,NULL); hThread[0] = ::CreateThread(NULL, 0, ThreadProc1,NULL, 0, NULL); hThread[1] = ::CreateThread(NULL, 0, ThreadProc2,NULL, 0, NULL); hThread[2] = ::CreateThread(NULL, 0, ThreadProc3,NULL, 0, NULL); //开始准备红包 while(dwMoney<1000) { memset(szBuffer,0,10); GetWindowText(hEditSet,szBuffer,10); sscanf( szBuffer, "%d", &dwMoney ); dwMoney++; memset(szBuffer,0,10); sprintf(szBuffer,"%d",dwMoney); SetWindowText(hEditSet,szBuffer); } ReleaseSemaphore(hSemaphore, 2, NULL); ::WaitForMultipleObjects(3, hThread,TRUE,INFINITE); ::CloseHandle(hSemaphore); return 0; } BOOL CALLBACK MainDlgProc(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam) { BOOL bRet = FALSE; switch(uMsg) { case WM_CLOSE: { EndDialog(hDlg,0); break; } case WM_INITDIALOG: { hEditSet = GetDlgItem(hDlg,IDC_EDIT_SET); hEdit1 = GetDlgItem(hDlg,IDC_EDIT_1); hEdit2 = GetDlgItem(hDlg,IDC_EDIT_2); hEdit3 = GetDlgItem(hDlg,IDC_EDIT_3); SetWindowText(hEditSet,"0"); SetWindowText(hEdit1,"0"); SetWindowText(hEdit2,"0"); SetWindowText(hEdit3,"0"); break; } case WM_COMMAND: switch (LOWORD (wParam)) { case IDC_BUTTON_BEGIN: { CreateThread(NULL, 0, ThreadBegin,NULL, 0, NULL);return TRUE;} } break ; } return bRet; } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // TODO: Place code here. DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG_MAIN),NULL,MainDlgProc); return 0; }
windows C/C++ 内核对象、事件对象、信号量相关推荐
- 【免杀前置课——Windows编程】十三、事件与信号量——事件与互斥体区别、操纵信号量实现游戏多开访问控制(附代码)
事件 事件可以完全控制,其他无法控制线程的执行顺序,但是事件对象可以做到. ***事件(Event)***是在线程同步中最常使用的一种同步对象,事件包含一个使用计数,一个是用来表示自动重置/手动重置的 ...
- 从零开始学习jQuery (五) 事件与事件对象【转】
一.摘要 事件是脚本编程的灵魂. 所以本章内容也是jQuery学习的重点. 本文将对jQuery中的事件处理以及事件对象进行详细的讲解. 二.前言 本篇文章是至今为止本系列内容最多的一篇, 足以可见其 ...
- 从零开始学习jQuery (五) 事件与事件对象
本系列文章导航 从零开始学习jQuery (一) 开天辟地入门篇 从零开始学习jQuery (二) 万能的选择器 从零开始学习jQuery (三) 管理jQuery包装集 从零开始学习jQuery ( ...
- js事件处理、事件对象
事件类型分类: 1 添加在html结构中的事件 <div id="div1" onclick="alert('append click event in html' ...
- jQuery框架学习第五天:事件与事件对象
jQuery框架学习第一天:开始认识jQuery jQuery框架学习第二天:jQuery中万能的选择器 jQuery框架学习第三天:如何管理jQuery包装集 jQuery框架学习第四天:使用jQu ...
- DOM(四)——事件、事件模型(冒泡)与事件对象的功能
文章目录 一.事件 二. 事件绑定 1. 在HTML中手工绑定 2. 在js中以赋值方式绑定 3. 在js中以添加事件监听对象的方式绑定: 3.1 原理 3.2 移除事件监听对象 三.事件模型 四.事 ...
- jQuery→事件、jQuery事件对象属性方法、多事件、自定义事件
click() mousedown()mouseup() mousemove() mouseout() hover() focusin() blur()focus() change() select( ...
- win32下多线程同步方式之临界区,互斥量,事件对象,信号量
// win32_thread_syn.cpp : 定义控制台应用程序的入口点. //#include "stdafx.h" #include "iostream&quo ...
- JavaScript重难点解析5(对象高级、浏览器内核与事件循环模型(js异步机制))
JavaScript重难点解析5(对象高级.浏览器内核与事件循环模型(js异步机制) 对象高级 对象创建模式 Object构造函数模式 对象字面量模式 工厂模式 自定义构造函数模式 构造函数+原型的组 ...
最新文章
- RRC Connection Reconfiguration
- 禁用windows更新完成后的重启提示
- 用户自助查看kubectl使用的证书状态以及如何更新
- Greenplum数据库(GPDB)初识
- 易优cms企业建站系统v1.5.1 含小程序源码
- markdown 入门1--标题目录代码图片
- 天正暖通天圆地方在哪_2020位于太白山景区海拔3511米天圆地方景点就变成了很多人望而却步的地方_天圆地方-评论-去哪儿攻略...
- 【NLP】Stanford
- jfinal结合freemarker,页面使用$符获取属性值报错原因解决
- JAVA里面==和euqals的区别
- 拓端tecdat|R语言:状态空间模型和卡尔曼滤波预测酒精死亡人数时间序列
- MAC使用CodeSign查看已签名的文件的数字签名情况
- 用FileZillaServer搭建FTP服务服务端、客户端
- iOS宏定义的黑魔法 - 宏菜鸟起飞手册
- echarts柱状图铺满_echarts 柱状图多种样式设置
- 稳重大气教师说课PPT模板
- 电子相册如何用c语言制作,电子相册怎样制作?
- diskpart给u盘分区
- 学习用HTML做新闻摘要
- ping命令基本使用详解
热门文章
- 简单的哈夫曼树程序实现
- 自学Vue开发Dapp去中心化钱包(一)
- 使用MobaXterm发布前端代码到服务器
- 五彩斑斓的颜色可预告心情
- 使用LR和XGBoost跑通criteo点击率预测数据集
- 60分钟吃掉嘎嘣脆的DeepCross模型
- namenode 格式化错误 Unable to check if JNs are ready for formatting
- pythonyaml参数传递_configutator-将yaml节点和命令行参数映射到python函数参数。-Nolan configutator To use:...
- 面向对象:让我们红尘作伴,吃的白白胖胖
- Tarjan算法专练