Delphi多线程编程(9)--认识等待函数WaitForSingleObject

转载自:万一的博客

  一下子跳到等待函数 WaitForSingleObject,是因为下面的Mutex、Semaphore、Event、WaitableTimer等同步手段都要使用这个函数。不过等待函数可不止WaitForSingleObject这一个,但是它是最简单的

function WaitForSingleObject(
    hHandle: THandle;    //要等待的对象句柄
    dwMillseconds: DWORD;    //等待的时间,单位是毫秒
): DWORD; srdcall;

  返回值说明如下

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.

  窗体文件

object Form1: TForm1
  Left = 0
  Top = 0
  Caption = ‘Form1‘
  ClientHeight = 124
  ClientWidth = 241
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = ‘Tahoma‘
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Button1: TButton
    Left = 88
    Top = 56
    Width = 75
    Height = 25
    Caption = ‘Button1‘
    TabOrder = 0
    OnClick = Button1Click
  end
end

  

时间: 2024-12-29 23:30:49

Delphi多线程编程(9)--认识等待函数WaitForSingleObject的相关文章

delphi 多线程编程

开始本应该是一篇洋洋洒洒的文字, 不过我还是提倡先做起来, 在尝试中去理解.先试试这个: procedure TForm1.Button1Click(Sender: TObject); var i: Integer; begin for i := 0 to 500000 do begin Canvas.TextOut(10, 10, IntToStr(i)); end; end; 上面程序运行时, 我们的窗体基本是 "死" 的, 可以在你在程序运行期间拖动窗体试试... Delphi

Delphi多线程编程(12)--多线程同步之Semaphore(信号对象)

转载自:万一的博客 之前已经有了两种线程同步的方法: CriticalSection(临界区)和Mutex(互斥)吗,这两种同步方法差不多,只是作用域不同 CriticalSection类似于只有一个蹲位的公共厕所,只能一个个地进 Mutex 对象类似于接力赛中的接力棒,某一时刻只能有一个人持有,谁拿着谁跑 什么是Semaphore(信号或叫信号量)呢? 譬如到银行办业务.或者到车站买票,原来只有一个服务员,不管有多少人排队等候,业务只能一个个地来 假如增加业务窗口,可以同时受理几个业务呢? 这

Delphi多线程编程(10)--多线程同步之Mutex(互斥对象)

原理分析: 互斥对象是系统内核对象,各个线程都可以拥有它,谁拥有它谁就可以执行 执行完毕,用ReleaseMutex 函数释放拥有权,以让其他等待的线程可以使用 其他线程可以使用 WaitForSingleObject函数排队等待(等待也可以理解为排队申请) 使用过程 var hMutex: THandle; {应该先声明一个全局的互斥句柄} CreateMutex {建立互斥对象} WaitForSingleObject {用等待函数排队等候} ReleaseMutex {释放拥有权} Clo

Delphi多线程编程(14)--多线程同步之WaitableTimer(等待定时器对象)

转载自:万一的博客 function CreateWaitableTimer( lpTimerAttributes: PSecurityAttributes; //安全 bManualReset: BOOL; //True:可调度多个线程:False:只调度一个线程 lpTimerName: PWideChar //名称 ):THandle; stdcall; //返回句柄 function SetWaitableTimer( hTime: THandle; //句柄 var lpDueTime

Delphi多线程编程(15)--多线程同步之WaitableTimer(等待定时器对象)[续]

转载自:万一的博客 本次专门研究下 SetWaitableTimer的第二个参数(起始时间) 它有正值.负值.0值这三种情况,前面已经用过 0 值 先学习负值(相对时间),也就是从当前算起隔多长时间开始执行 这个相对时间是以 1/100 纳秒为单位的,譬如赋值:3*10000000 相当于 3 秒 1 s(秒) = 1,000            ms(毫秒); 1 s(秒) = 1,000,000        µs(微妙); 1 s(秒) = 1,000,000,000    ns(纳秒)

Delphi多线程编程之同步读写全局数据

开始研究最重要的多线程读写全局数据了,结合书上的例子,我修改成下面的情况: unit Tst_Thread3U; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls; type   TForm1 = class(TForm)     Button1: TButton;     Memo1: TMemo;     Button2: TBu

Delphi多线程编程(1)--先入门再说

转载:万一的博客 多线程应该是编程工作者的基础技能, 但这个基础对我来讲的确有点难(起码昨天以前是这样). 开始本应该是一篇洋洋洒洒的文字, 不过我还是提倡先做起来, 在尝试中去理解. 先试试这个 procedure TForm1.Button1Click(Sender: TObject); var i: Integer; begin for i:= 0 to 500000 do begin Canvas.TextOut(10, 10, IntToStr(i)); end; end; 上面程序运

Delphi多线程编程(8)--多线程同步之CriticalSection(临界区)

转载自:万一的博客 先看一段程序 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1=class(TForm) ListBox1: TListBox; Button1: TButton; procedure FormCreate(Sender: TObject); procedure

多线程编程复习 windows线程函数必须为全局函数或者静态函数

调用CreateThread(...)创建线程时要指定所创建线程的入口函数,此入口函数只能是全局函数或者类的静态成员函数. 全局函数很容易理解,但如果是类的成员函数则必须是静态成员函数,为何, 因为类的非静态成员函数只能通过类的对象去调用,但是创建线程时从那里能获得类的对象而去调用类的成员函数呢? 类的静态成员函数类所有,不专属于类的任何一个对象,所以不创建类的对象也可以调用. 全局函数格式: DWORD WINAPI ProcName(LPVOID lpPara){ } 类的静态函数格式: s