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

在多线程下面,有时候会希望等待某一线程完成了再继续做其他事情,要实现这个目的,可以使用Windows API函数WaitForSingleObject,或者WaitForMultipleObjects。这两个函数都会等待Object被标为有信号(signaled)时才返回的。
那么,什么是信号呢?简单来说,Windows下创建的Object都会被赋予一个状态量。如果Object被激活了,或者正在使用,那么该Object就是无信号,也就是不可用;另一方面,如果Object可用了,那么它就恢复有信号了。这两个函数的优点是它们在等待的过程中会进入一个非常高效沉睡状态,只占用极少的CPU时间片。

DWORD WINAPI WaitForSingleObject(_In_ HANDLE hHandle,_In_ DWORD  dwMilliseconds
);
DWORD WINAPI WaitForMultipleObjects(_In_       DWORD  nCount,_In_ const HANDLE *lpHandles,_In_       BOOL   bWaitAll,_In_       DWORD  dwMilliseconds
);

如果该内核对象处于已通知状态,则该函数立即返回WAIT_OBJECT_0。
如果等待超时,该函数返回WAIT_TIMEOUT。
如果该函数失败,返回WAIT_FAILED。

我们可以根据返回值来判断进程的当前状态,来决定main函数是否退出。

#include "stdafx.h"
#include <Windows.h>
#include <process.h>unsigned WINAPI ThreadFun1(void *arg)
{int cnt = *(int*)arg;for (int i = 0; i < cnt; i++){Sleep(1000);printf("The thread is running.\n");}return 0;
}int main()
{unsigned threadid;int param = 5;HANDLE h = (HANDLE)_beginthreadex(NULL, 0, ThreadFun1, &param, 0, &threadid);if (h == 0){printf("Can not create a thread.\n");return 0;}DWORD st = WaitForSingleObject(h, INFINITE);if (st == WAIT_FAILED)printf("Failed to wait a thread.\n");if (st == WAIT_OBJECT_0)printf("The thread is stoped.\n");if (st == WAIT_TIMEOUT)printf("Timeout to wait a thread.\n");printf("End of main.\n");return 0;
}

其运行结果如下:

The thread is running.
The thread is running.
The thread is running.
The thread is running.
The thread is running.
The thread is stoped.
End of main.

这表明main程序等待进程结束后才退出的。

但我们如果将wait函数中的超时设置减少,例如将INFINITE调整为5000后,则结果如下:

DWORD st = WaitForSingleObject(h, 5000);
The thread is running.
The thread is running.
The thread is running.
The thread is running.
Timeout to wait a thread.
End of main.

这就会造成等待进程超时退出同样也会造成进程的结束。也就是说在短时间内运行的进程可以通过WaitForSingleObject或WaitForMultipleObjects函数来处理,但如果是长时间的进程则有问题了。

简单处理办法是使用循环等待方法,代码修改如下:

    DWORD st;do {printf("Wait a time ...\n");st = WaitForSingleObject(h, 3000);} while (st == WAIT_TIMEOUT);

其运行结果为:

Wait a time ...
The thread is running.
The thread is running.
The thread is running.
Wait a time ...
The thread is running.
The thread is running.
End of main.

从结果上看,这种循环等待是有效果的。

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

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

  1. 基于visual c++之windows核心编程代码分析(42)windows下进程的身份切换

    进程是操作系统结构的基础:是一个正在执行的程序:计算机中正在运行的程序实例:可以分配给处理器并由处理器执行的一个实体: 由单一顺序的执行显示,一个当前状态和一组相关的系统资源所描述的活动单元. 对应用 ...

  2. windows最重要的三个dll

    windows最重要的三个dll是:Kernel,User,GDI三个 Kernel操作系统核心功能服务,包括进程与线程控制,内存管理.文件访问等. User负责处理用户接口,包括键盘和鼠标输入.窗口 ...

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

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

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

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

  5. W ndows主进程已停止,windows主进程rundll32已停止工作的四种解决方法介绍

    操作系统出现:windows主进程rundll32已停止工作 这种出错的提示,一般是在Windows7操作系统之中,可能会有很多种原因导致的,所以还需要逐一排查,解决之. 这是一个很少见的问题,开机后 ...

  6. Windows下进程占用CPU过大的解决方案

    Windows下进程占用CPU过大 1.WMI Provider Host(wmiprvse.exe)占用CPU高 新装windows8.1 发现WMI Provider Host(wmiprvse. ...

  7. Windows的进程创建和映像装入

    关于Windows的进程创建和映像装入的过程,"Microsoft Windows Internals 4e"一书的第六章中有颇为详细的说明.本文就以此为依据,夹译.夹叙.夹议地作 ...

  8. 转载:Windows的进程创建和映像装入

    原文地址:http://blog.chinaunix.net/uid-20476365-id-1942481.html  关于Windows的进程创建和映像装入的过程,"Microsoft ...

  9. 列举 Windows 所有进程(ToolHelp)

    管理 随笔-79 文章-0 评论-1194  列举 Windows 所有进程(ToolHelp) 引子 由于这阵子必须得做几个小东西才行,估计着呢,是要做个 Windows 的任务管理器出来才行, 但 ...

  10. Linux中创建Daemon进程的三种方法

    Linux中创建Daemon进程的三种方法 什么是daemon进程? Unix/Linux中的daemon进程类似于Windows中的后台服务进程,一直在后台运行运行,例如http服务进程nginx, ...

最新文章

  1. vs中.exe运行闪退的解决办法
  2. DIV+CSS笔记(一)
  3. 00-深入学习cache
  4. 动态毛玻璃特效html,js和CSS3炫酷毛玻璃面板特效
  5. python双轴折线图是什么意思_操作-简易图形-折线图
  6. Vue学习之路---No.7(分享心得,欢迎批评指正)
  7. mongoose日期 时间 范围查询
  8. kali linux2.0下MariaDB修改密码
  9. dh协议c语言代码,openssl开源程序dh算法解析之dh_ameth.c
  10. win8 完全禁用uac的方法
  11. VC++ 6.0实现视频捕捉(VFW)
  12. 云计算是什么? 云计算入门必备的60条术语
  13. pAdTy_1 构建图形和动画应用程序
  14. 【软考中级-网工】1
  15. 关于Allan方差分析陀螺仪误差的几个摘要
  16. 计算机学习(四)基本电路原理——实现反相控制
  17. 有道字典 Chrome Extension
  18. Debian搭建dns服务器
  19. 穆迪宣布致力于“气候话语权”运动
  20. java 截取字符串某个字符开始与某个字符结束的中间的部分

热门文章

  1. 浮点错误的意思-PAT 、OJ
  2. Linux系统不同主机之间的时间同步
  3. 监控系统之weblogic,apache,tuxedo的监控项的整理
  4. Ubuntu 16.04 PXE+kickstart部署系统
  5. 奇异值分解与低秩矩阵近似
  6. 在MacOS和iOS系统中使用OpenCV
  7. POJ 2239 匈牙利算法
  8. NSString 转为gbk
  9. ueditor使用小结
  10. bind函数:给对象绑定方法。