2019独角兽企业重金招聘Python工程师标准>>>

采用事件的方式来通知从线程运行函数退出来,它的实现原理是这样,在那个死循环里不断地使用 WaitForSingleObject函数来检查事件是否满足,如果满足就退出线程,不满足就继续运行。当在线程里运行阻塞的函数时,就需要在退出线程 时,先要把阻塞状态变成非阻塞状态,比如使用一个线程去接收网络数据,同时使用阻塞的SOCKET时,那么要先关闭SOCKET,再发送事件信号,才可以退出线程的。

HANDLE WINAPI CreateEvent(_In_opt_ LPSECURITY_ATTRIBUTES lpEventAttributes,_In_     BOOL                  bManualReset,_In_     BOOL                  bInitialState,_In_opt_ LPCTSTR               lpName
);
BOOL WINAPI ResetEvent(_In_ HANDLE hEvent
);
BOOL WINAPI SetEvent(_In_ HANDLE hEvent
);
BOOL WINAPI CloseHandle(_In_ HANDLE hObject
);

CreateEvent的参数:

  • lpEventAttributes:一个指向SECURITY_ATTRIBUTES结构的指针,确定返回的句柄是否可被子进程继承。如果lpEventAttributes是NULL,此句柄不能被继承。
  • bManualReset:指定将事件对象创建成手动复原还是自动复原。如果是TRUE,那么必须用ResetEvent函数来手工将事件的状态复原到无信号状态。如果设置为FALSE,当事件被一个等待线程释放以后,系统将会自动将事件状态复原为无信号状态。
  • bInitialState:指定事件对象的初始状态。如果为TRUE,初始状态为有信号状态;否则为无信号状态。
  • lpName:指定事件的对象的名称,是一个以0结束的字符串指针。名称的字符格式限定在MAX_PATH之内。名字是对大小写敏感的。
#include "stdafx.h"
#include <Windows.h>
#include <process.h>int num = 0;
CRITICAL_SECTION cs;
HANDLE hEvent = NULL;unsigned WINAPI ThreadInc(void *arg)
{int cnt = *(int*)arg;WaitForSingleObject(hEvent, INFINITE);for (int i = 0; i < cnt; i++){num += 1;printf("Inc ");Sleep(10);}return 0;
}
unsigned WINAPI ThreadDec(void *arg)
{int cnt = *(int*)arg;WaitForSingleObject(hEvent, INFINITE);for (int i = 0; i < cnt; i++){num -= 1;printf("Dec ");Sleep(10);}return 0;
}
int main()
{int param = 50;HANDLE h[2];hEvent = CreateEvent(NULL, true, false, NULL);h[0]= (HANDLE)_beginthreadex(NULL, 0, ThreadInc, &param, 0, NULL);if (h[0] == 0){printf("Can not create a thread 1.\n");return 0;}h[1] = (HANDLE)_beginthreadex(NULL, 0, ThreadDec, &param, 0, NULL);if (h[1] == 0){printf("Can not create a thread 2.\n");return 0;}printf("Ready to run.\n", num);SetEvent(hEvent);WaitForMultipleObjects(2, h, true, INFINITE);ResetEvent(hEvent);CloseHandle(hEvent);printf("The num is %d, and end of main.\n", num);return 0;
}

上述例子中,主程序中CreateEvent创建了一个事件控制,只有在执行SetEvent后事件阻塞才宣告解除,解除后两个进程就分别开始执行。其执行结果为:

Ready to run.
Inc Dec Inc Dec Inc Dec Inc Dec Dec Inc Dec Inc Inc Dec Inc Dec Dec Inc Inc Dec
Inc Dec Inc Dec Inc Dec Inc Dec Inc Dec Inc Dec Inc Dec Inc Dec Inc Dec Inc Dec
Inc Dec Inc Dec Inc Dec Inc Dec Inc Dec Inc Dec Inc Dec Inc Dec Inc Dec Inc Dec
Inc Dec Inc Dec Inc Dec Inc Dec Inc Dec Inc Dec Inc Dec Inc Dec Inc Dec Inc Dec
Inc Dec Inc Dec Inc Dec Inc Dec Inc Dec Inc Dec Inc Dec Inc Dec Inc Dec Inc Dec
The num is 0, and end of main.

从上面可以看到其执行是在SetEvent后,其执行是独立运行的。

转载于:https://my.oschina.net/u/2308182/blog/1421849

关于windows的进程处理(七)相关推荐

  1. windows内核开发笔记七:内核开发OVERLAPPED结构体详解

    windows内核开发笔记七:内核开发OVERLAPPED结构体详解 typedef struct _OVERLAPPED {   DWORD Internal;   DWORD InternalHi ...

  2. linux六种进程状态,Linux操作系统中进程的七种状态

    Linux操作系统中进程的七种状态 发布时间:2018-05-07 20:43, 浏览次数:741 , 标签: Linux 1 Linux中进程的七种状态(1)R运行状态(runing):并不意味着进 ...

  3. windows中进程详解

    近来闲得无事,就在网上搜集了部分windows中的一些进程,希望大家能喜欢.这东西太多,也许会让你看得烦躁.冒犯指出敬请原谅,谢谢! 系统进程描述 system process 进程文件: [syst ...

  4. C#之windows桌面软件第七课:(下集)串口工具实现数据校验、用灯反应设备状态

    C#之windows桌面软件第七课:(下集)串口工具实现数据校验.用灯反应设备状态 using System; using System.Collections.Generic; using Syst ...

  5. linux和windows的进程的虚拟地址空间

    昨晚看到了深夜,终于对进程的虚拟地址空间有了个大致的了解,很激动,也很欣慰.回头想来,一个程序员,真的应该知道这些知识,否则还真不太称职. 首先告诉大家,我后面提到的这些知识在<windows核 ...

  6. 进程 zabbix_Zabbix监控在windows的进程(非进程数)

    场景介绍: 小Z同学最近遇到个项目需求,需求是用zabbix监控运行在windows的进程.然鹅,当小Z同学在网上搜了一大堆,发现基本上都是使用官方的proc.num(***.exe)键值拿到进程数量 ...

  7. Windows守护进程简单示例

    转载: https://blog.csdn.net/kikaylee/article/details/51395360 /* @描述:一个简单的Windows守护进程的例子(C++版本) @作者:ki ...

  8. Windows下进程通信的几种方式介绍

    Windows下进程通信的几种方式 一.消息通信 所谓消息通信,就是指Windows发出的一个通知,告诉应用程序某个事情发生了.例如,单击鼠标.改变窗口尺寸.按下键盘上的一个键都会使Windows发送 ...

  9. linux进程僵停状态,Linux操作系统中进程的七种状态

    1 Linux中进程的七种状态(1)R运行状态(runing):并不意味着进程一定在运行中,也可以在运行队列里:(2)S睡眠状态(sleeping):进程在等待事件完成:(浅度睡眠,可以被唤醒)(3) ...

  10. 漫谈兼容内核之十七:再谈Windows的进程创建

    在漫谈之十中.我根据"Microsoft Windows Internals 4e"一书第六章的叙述介绍了Windows的进程创建和映像装入的过程.但是,由于缺乏源代码的支撑,这样 ...

最新文章

  1. 用CMake构建工程时 cmake -G“Unix Makefiles“ 的使用
  2. QML模拟示波器界面。
  3. PHP-fpm的master进程杀死work还能处理任务吗
  4. 大数据将如何重构汽车产业的商业模式?
  5. 数据结构树二叉树计算节点_查找二叉树中叶节点的数量 数据结构
  6. YouTube-DNN优化原理推导
  7. 注意!恶意NPM包正在安装勒索软件和密码窃取木马
  8. 学习项目管理PRINCE2有什么用??
  9. 整合hibernate4到spring4mvc框架
  10. JAVA计算机毕业设计实验室耗材管理系统(附源码、数据库)
  11. list集合去重和排序
  12. compiled python file_YouCompleteMe安装的问题requires Vim compiled with Python (2.6+ or 3.3+) support...
  13. Linux+conda+R+Rstudio下载安装环境全方面配置
  14. 在Ubuntu安装完成后更改默认的语言LANG,出现Cannot set LC_CTYPE to default locale: No such file or directory错误的解决办法
  15. matlab 数据透视表,MATLAB | 用行为数据处理EEG数据事件码
  16. vulkan同步机制之——Fence Barriers
  17. 二极管三极管 模电
  18. mit2021计算机竞赛女生,2021全国大学生计算机系统能力大赛操作系统设计赛第一场研讨会隆重举行...
  19. iOS开发:字符串处理:截取字符串、匹配字符串、分割字符串
  20. 详细分析DRM架构下获取HDMI/DP/VGA/DVI显示屏参数的实现原理

热门文章

  1. firefox下几个实用的免费开发插件
  2. java实现简易客户信息管理系统
  3. LIME:一种解释机器学习模型的方法
  4. java面试 内存中堆和栈的区别
  5. bzoj1066 蜥蜴 (dinic)
  6. WebForm页面生命周期及asp.net运行机制
  7. python学习笔记之socket(第七天)
  8. queue 队列优先级
  9. 求 1~n 之间素数的个数
  10. 请教,一个解决方案中包含多个相互引用的项目,该如何配置?