5,388
社区成员
发帖
与我相关
我的任务
分享
unit utMutex;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure SetItem(Sender: TObject);
public
{ Public declarations }
end;
TtestThread = class(TThread)
protected
procedure execute; override;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
const
MAX = 128;
var
//cs : TRTLCriticalSection;
DoFlag : integer = 0;
hMutex : THandle = 0;
NextNumber : integer = 0;
iArr : array[1..MAX] of integer;
function GetNextNumber: integer;
begin
result := NextNumber;
inc(NextNumber);
end;
{ TtestThread }
procedure TtestThread.execute;
var
i : integer;
begin
inherited;
FreeOnTerminate := True;
OnTerminate := Form1.SetItem;
//EnterCriticalSection(cs);
if WaitForSingleObject(hMutex, INFINITE) = WAIT_OBJECT_0 then
for i := 1 to MAX do
begin
iArr[i] := GetNextNumber;
sleep(5);
end;
//LeaveCriticalSection(cs);
ReleaseMutex(hMutex);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
//InitializeCriticalSection(cs);
hMutex := CreateMutex(nil,false,nil);
TtestThread.Create(false);
TtestThread.Create(false);
end;
procedure TForm1.SetItem(Sender: TObject);
var
i : integer;
begin
inc(DoFlag);
if DoFlag = 2 then
begin
for i := 1 to MAX do
memo1.Lines.Add(inttostr(iArr[i]));
//DeleteCriticalSection(cs);
CloseHandle(hMutex);
end;
end;
end.