承接上一篇: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++ 内核对象、事件对象、信号量相关推荐

  1. 【免杀前置课——Windows编程】十三、事件与信号量——事件与互斥体区别、操纵信号量实现游戏多开访问控制(附代码)

    事件 事件可以完全控制,其他无法控制线程的执行顺序,但是事件对象可以做到. ***事件(Event)***是在线程同步中最常使用的一种同步对象,事件包含一个使用计数,一个是用来表示自动重置/手动重置的 ...

  2. 从零开始学习jQuery (五) 事件与事件对象【转】

    一.摘要 事件是脚本编程的灵魂. 所以本章内容也是jQuery学习的重点. 本文将对jQuery中的事件处理以及事件对象进行详细的讲解. 二.前言 本篇文章是至今为止本系列内容最多的一篇, 足以可见其 ...

  3. 从零开始学习jQuery (五) 事件与事件对象

    本系列文章导航 从零开始学习jQuery (一) 开天辟地入门篇 从零开始学习jQuery (二) 万能的选择器 从零开始学习jQuery (三) 管理jQuery包装集 从零开始学习jQuery ( ...

  4. js事件处理、事件对象

    事件类型分类: 1 添加在html结构中的事件 <div id="div1" onclick="alert('append click event in html' ...

  5. jQuery框架学习第五天:事件与事件对象

    jQuery框架学习第一天:开始认识jQuery jQuery框架学习第二天:jQuery中万能的选择器 jQuery框架学习第三天:如何管理jQuery包装集 jQuery框架学习第四天:使用jQu ...

  6. DOM(四)——事件、事件模型(冒泡)与事件对象的功能

    文章目录 一.事件 二. 事件绑定 1. 在HTML中手工绑定 2. 在js中以赋值方式绑定 3. 在js中以添加事件监听对象的方式绑定: 3.1 原理 3.2 移除事件监听对象 三.事件模型 四.事 ...

  7. jQuery→事件、jQuery事件对象属性方法、多事件、自定义事件

    click() mousedown()mouseup() mousemove() mouseout() hover() focusin() blur()focus() change() select( ...

  8. win32下多线程同步方式之临界区,互斥量,事件对象,信号量

    // win32_thread_syn.cpp : 定义控制台应用程序的入口点. //#include "stdafx.h" #include "iostream&quo ...

  9. JavaScript重难点解析5(对象高级、浏览器内核与事件循环模型(js异步机制))

    JavaScript重难点解析5(对象高级.浏览器内核与事件循环模型(js异步机制) 对象高级 对象创建模式 Object构造函数模式 对象字面量模式 工厂模式 自定义构造函数模式 构造函数+原型的组 ...

最新文章

  1. RRC Connection Reconfiguration
  2. 禁用windows更新完成后的重启提示
  3. 用户自助查看kubectl使用的证书状态以及如何更新
  4. Greenplum数据库(GPDB)初识
  5. 易优cms企业建站系统v1.5.1 含小程序源码
  6. markdown 入门1--标题目录代码图片
  7. 天正暖通天圆地方在哪_2020位于太白山景区海拔3511米天圆地方景点就变成了很多人望而却步的地方_天圆地方-评论-去哪儿攻略...
  8. 【NLP】Stanford
  9. jfinal结合freemarker,页面使用$符获取属性值报错原因解决
  10. JAVA里面==和euqals的区别
  11. 拓端tecdat|R语言:状态空间模型和卡尔曼滤波预测酒精死亡人数时间序列
  12. MAC使用CodeSign查看已签名的文件的数字签名情况
  13. 用FileZillaServer搭建FTP服务服务端、客户端
  14. iOS宏定义的黑魔法 - 宏菜鸟起飞手册
  15. echarts柱状图铺满_echarts 柱状图多种样式设置
  16. 稳重大气教师说课PPT模板
  17. 电子相册如何用c语言制作,电子相册怎样制作?
  18. diskpart给u盘分区
  19. 学习用HTML做新闻摘要
  20. ping命令基本使用详解

热门文章

  1. 简单的哈夫曼树程序实现
  2. 自学Vue开发Dapp去中心化钱包(一)
  3. 使用MobaXterm发布前端代码到服务器
  4. 五彩斑斓的颜色可预告心情
  5. 使用LR和XGBoost跑通criteo点击率预测数据集
  6. 60分钟吃掉嘎嘣脆的DeepCross模型
  7. namenode 格式化错误 Unable to check if JNs are ready for formatting
  8. pythonyaml参数传递_configutator-将yaml节点和命令行参数映射到python函数参数。-Nolan configutator To use:...
  9. 面向对象:让我们红尘作伴,吃的白白胖胖
  10. Tarjan算法专练