一下子跳到等待函数 WaitForSingleObject, 是因为下面的 Mutex、Semaphore、Event、WaitableTimer 等同步手段都要使用这个函数; 不过等待函数可不止 WaitForSingleObject 它一个, 但它最简单.
function WaitForSingleObject(
 hHandle: THandle;   {要等待的对象句柄}
 dwMilliseconds: DWORD {等待的时间, 单位是毫秒}
): DWORD; stdcall;    {返回值如下:}
WAIT_OBJECT_0 {等着了, 本例中是: 等的那个进程终于结束了}
WAIT_TIMEOUT  {等过了点(你指定的时间), 也没等着}
WAIT_ABANDONED {好不容易等着了, 但人家还是不让咱执行; 这一般是互斥对象}
//WaitForSingleObject 的第二个参数一般给常数值 INFINITE, 表示一直等下去, 死等.
WaitForSingleObject 等待什么? 在多线程里就是等待另一个线程的结束, 快来执行自己的代码; 不过它可以等待的对象可不止线程; 这里先来一个等待另一个进程结束的例子, 运行效果图:
\
代码文件:unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;
type
 TForm1 = class(TForm)
  Button1: TButton;
  procedure Button1Click(Sender: TObject);
 end;
var
 Form1: TForm1;
implementation
{$R *.dfm}
var
 hProcess: THandle; {进程句柄}
{等待一个指定句柄的进程什么时候结束}
function MyThreadFun(p: Pointer): DWORD; stdcall;
begin
 if WaitForSingleObject(hProcess, INFINITE) = WAIT_OBJECT_0 then
  Form1.Text := Format('进程 %d 已关闭', [hProcess]);
 Result := 0;
end;
{启动一个进程, 并建立新线程等待它的结束}
procedure TForm1.Button1Click(Sender: TObject);
var
 pInfo: TProcessInformation;
 sInfo: TStartupInfo;
 Path: array[0..MAX_PATH-1] of Char;
 ThreadID: DWORD;
begin
 {先获取记事本的路径}
 GetSystemDirectory(Path, MAX_PATH);
 StrCat(Path, 'notepad.exe');
 {用 CreateProcess 打开记事本并获取其进程句柄, 然后建立线程监视}
 FillChar(sInfo, SizeOf(sInfo), 0);
 if CreateProcess(Path, nil, nil, nil, False, 0, nil, nil, sInfo, pInfo) then
 begin
  hProcess := pInfo.hProcess;              {获取进程句柄}
  Text := Format('进程 %d 已启动', [hProcess]);
  CreateThread(nil, 0, @MyThreadFun, nil, 0, ThreadID); {建立线程监视}
 end;
end;
end.

多线程编程9认识等待函数WaitForSingleObject的更多相关文章

  1. 【C/C++开发】多线程编程中的join函数

    多线程编程中的join函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 # coding: utf-8 # 测试多线程中join的 ...

  2. 多线程编程中的join函数

    # coding: utf-8 # 测试多线程中join的功能 import threading, time def doWaiting(): print 'start waiting1: ' + t ...

  3. C++使用Windows API CreateMutex函数多线程编程

    C++中也可以使用Windows 系统中对应的API函数进行多线程编程.使用CreateThread函数创建线程,并且可以通过CreateMutex创建一个互斥量实现线程间数据的同步: #includ ...

  4. [转]Delphi多线程编程入门(二)——通过调用API实现多线程

    以下是一篇很值得看的关于Delphi多线程编程的文章,内容很全面,建议收藏. 一.入门 ㈠. function CreateThread(    lpThreadAttributes: Pointer ...

  5. delphi之多线程编程(尚未学习)

    本文的内容取自网络,并重新加以整理,在此留存仅仅是方便自己学习和查阅.所有代码均亲自测试 delphi7下测试有效.图片均为自己制作. 多线程应该是编程工作者的基础技能, 但这个基础我从来没学过,所以 ...

  6. delphi 多线程编程

    开始本应该是一篇洋洋洒洒的文字, 不过我还是提倡先做起来, 在尝试中去理解.先试试这个: procedure TForm1.Button1Click(Sender: TObject); var i: ...

  7. 多线程编程-pthread 未定义的引用

    多线程编程时用到函数库 pthread.h ,但是该函数库不是linux默认的函数库,所以编译c文件时,需要在目标代码文件后加上 -lpthread参数. 1.未加上 -lpthread 编译时,报错 ...

  8. python 常见错误和异常 函数 正则表达式及多线程编程

    生成随机密码#!/usr/bin/env python import stringfrom random import choice def gen_pass(num=9): all_chs = st ...

  9. Qt多线程编程中的对象线程与函数执行线程

    近来用Qt编写一段多线程的TcpSocket通信程序,被其中Qt中报的几个warning搞晕了,一会儿是说“Cannot create children for a parent that is in ...

随机推荐

  1. D3.js 动画 过渡效果 (V3版本)

    一 . 过渡的启动   启动过渡效果,与以下四个方法相关:   d3.transition([selection],[name]) //创建一个过渡对象.但是由于每个选择集中都有transition( ...

  2. Flyway - Version control for your database

    Flyway 是什么? Flyway是个数据库版本管理工具.在开发过程中,数据库难免发生变更,例如数据变更,表结构变更.新建表或者视图等等. 在项目进行时无法保证一旦开发环境中的数据库内容变化候会去测 ...

  3. 微信小程序 初阶

    公司最近安排要学习一下微信小程序的开发,大体看了看,幸亏还有点javascript的底子,学起来不至于太难,其它的语法什么的真需要好好适应适应....头大 从头开始看微信小程序开发的文档,目前来说没有 ...

  4. Dubbo中有哪些角色?

    registry 注册中心. 是用于发布和订阅服务的一个平台.用于替代SOA结构体系框架中的ESB服务总线的. 发布 开发服务端代码完毕后, 将服务信息发布出去. 实现一个服务的公开. 订阅 客户端程 ...

  5. gitj基础2

    回滚版本        git reset --hard HEAD^  回滚上一个版本  git reset --hard 版本号(或者版本号前6位)  回滚到指定版本      如果修改版本了,也关 ...

  6. Redis Desktop Manager可视化工具连接不上redis

    1.在centos中启动redis之后,redis进程也是可查的,但是一连接可视化工具就报错: can't connect to redis-server 2.原因分析: ①首先redis是肯定已经开 ...

  7. Nginx集群配置启动报错

  8. C中为什么不能用==比较字符串?

    通常的回答是,==比较的不是字符串的内容,它是在比较指针.或者说,==(或者!=)仅比较两个字符串的首地址,而不会比较字符串每个字符. 那其实接下来应该问的问题是,为什么会只比较首地址呢? 因为早期的 ...

  9. 前端 -- javas-基本语法/引用等

    javas-基本语法/引用等 JavaScript介绍 JavaScript是运行在浏览器端的脚步语言,JavaScript主要解决的是前端与用户交互的问题,包括使用交互与数据交互. JavaScri ...

  10. iOS 多层级的immutable objects 转换成 mutable objects

    第一种方法是:将多层级的递归转换 方法: +(id) recursiveMutable:(id)object { if([object isKindOfClass:[NSDictionary clas ...