Delphi里使用事件Event与WaitForSingleObject实现线程同步

5bug 2018-01-10 463人围观 ,发现0个评论 线程同步​WaitForSingleObjectCreateEvent

大家都知道多线程同步的方法有很多种,这里给大家分享下Delphi里使用事件Event与WaitForSingleObject实现线程同步的方法,仅仅是个小例子,供初学者了解事件的用法,如果使用方法不当,欢迎指正!

主要用到的函数是:

CreateEvent:创建一个Windows事件

SetEvent:将事件对象设置为有信号状态

ResetEvent: 将事件对象设置为无信号状态

CloseHandle:销毁事件句柄

WaitForSingleObject:等待内核对象的信号状态,当内核对象是有信号的时候才返回,否则则阻塞


关键代码如下:

unit Unit14;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm14 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    FEvent: THandle;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form14: TForm14;

implementation

{$R *.dfm}

procedure TForm14.Button1Click(Sender: TObject);
begin
  SetEvent(FEvent);
end;

procedure TForm14.Button2Click(Sender: TObject);
var
  AProc: TProc;
begin
  AProc := procedure
    begin
      while not Application.Terminated do
      begin
        if WaitForSingleObject(FEvent, INFINITE) = WAIT_OBJECT_0 then
        begin
          outputdebugstring(PChar('运行中...' + IntToStr(GetTickCount)));
        end;
        sleep(1);
      end;
    end;
  TThread.CreateAnonymousThread(AProc).Start;
end;

procedure TForm14.Button3Click(Sender: TObject);
begin
  ResetEvent(FEvent);
end;

procedure TForm14.FormCreate(Sender: TObject);
begin
  FEvent := CreateEvent(nil, True, True, nil);
  ResetEvent(FEvent);
end;

procedure TForm14.FormDestroy(Sender: TObject);
begin
  CloseHandle(FEvent);
end;

end.

这里使用了匿名线程,请在高版本Delphi里运行,如果是在低版本里稍作修正即可!

不容错过
Powered By Z-BlogPHP