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. helloworld 1 2結合版 (有意思)
  2. [HAOI2007] 理想的正方形
  3. 《音乐达人秀:Adobe Audition实战200例》——实例7 定时录制网络音乐节目
  4. 修改html页面的title,可以自定义
  5. java base64编码的三种方式
  6. python的turtle模块(海龟画图)
  7. NS2典型例子简单分析
  8. 管家婆支持mysql_开放多接口,支持对接管家婆等第三方应用
  9. Scratch3.0学习视频链接
  10. 简单的MQTT客户端工具
  11. ffmpeg 的下载安装
  12. X32位 天堂2 二章/三章 服务端协议号修改方法
  13. var模型的建模步骤python_Python语言之概述建模步骤
  14. “芝诺大数据教学科研平台”荣获“2018大数据应用优秀案例”
  15. ubantu 20.04 系统重装
  16. EXCEL如何设置打印区域
  17. CodeForces - 1436D Bandit in a City
  18. win10环境下搭建IIS图片服务器
  19. 互斥锁(mutex lock)
  20. Android2.0 Release 1 Eclair API变化预览

热门文章

  1. 1064. 朋友数(20)-PAT乙级真题 Java
  2. L2-002. 链表去重-PAT团体程序设计天梯赛GPLT
  3. L2-014. 列车调度-PAT团体程序设计天梯赛GPLT
  4. vue key重复_Vue 前端面试题
  5. java 性能调优,使用 async-profiler + FlameGraph火焰图 分析cup消耗热点代码
  6. AIX和LINUX主机 CPU 内存 磁盘使用率监控
  7. 解答:一个perl操作config.ini的出现的 cannot find file or dirctionary,可明明文件存在
  8. Java Project项目在Linux下部署步骤及注意事项
  9. 西部开源学习笔记《unit 2》
  10. JQuery插件之弹窗:lhgDialog