大家都知道多线程同步的方法有很多种,这里给大家分享下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里运行,如果是在低版本里稍作修正即可!