unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,SyncObjs;type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end; TThreadA=class(TThread)
private protected
procedure Execute();override;
public end; TThreadB=class(TThread)
private protected
procedure Execute();override;
public end;var
Form1: TForm1;implementation{$R *.dfm}
var
mutex:Thandle;
g_sum:integer;
//g_ThdA:TThreadA;
//g_ThdB:TThreadB;
//cs:TCriticalSection;
procedure TForm1.Button2Click(Sender: TObject);
beginend;{ TThreadB }procedure TThreadB.Execute;
var
i,sum:integer;
begin
if not terminated then exit;
for i:=1 to 100 do
sum:=sum + i;
if WaitForSingleObject(mutex,infinite) =WAIT_OBJECT_0 then //占有互斥对象
begin
g_sum:=g_sum + sum;
releaseMutex(mutex);//解除与互斥对象的关系
end;
end;
procedure TThreadA.Execute;
var
i,sum:integer;
begin
if not terminated then exit;
for i:=1 to 100 do
sum:=sum + 1;
if WaitForSingleObject(mutex,infinite)=WAIT_OBJECT_0 then //占有互斥对象
begin
g_sum:=sum;
releaseMutex(mutex);//解除互斥关系
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
mutex:=CreateMutex(nil,false,nil);
TThreadA.Create(false);
TThreadB.Create(false); //A执行完,B执行,主线程显示结果
if WaitForSingleObject(mutex,infinite) =WAIT_OBJECT_0 then //主线程申请占有互斥对象
showmessage(inttostr(g_sum));
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
closeHandle(mutex);
end;end.
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,SyncObjs;type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end; TThreadA=class(TThread)
private protected
procedure Execute();override;
public end; TThreadB=class(TThread)
private protected
procedure Execute();override;
public end;var
Form1: TForm1;implementation{$R *.dfm}
var
mutex:Thandle;
g_sum:integer;
//g_ThdA:TThreadA;
//g_ThdB:TThreadB;
//cs:TCriticalSection;
procedure TForm1.Button2Click(Sender: TObject);
beginend;{ TThreadB }procedure TThreadB.Execute;
var
i,sum:integer;
begin
if not terminated then exit;
for i:=1 to 100 do
sum:=sum + i;
if WaitForSingleObject(mutex,infinite) =WAIT_OBJECT_0 then //占有互斥对象
begin
g_sum:=g_sum + sum;
releaseMutex(mutex);//解除与互斥对象的关系
end;
end;
procedure TThreadA.Execute;
var
i,sum:integer;
begin
if not terminated then exit;
for i:=1 to 100 do
sum:=sum + 1;
if WaitForSingleObject(mutex,infinite)=WAIT_OBJECT_0 then //占有互斥对象
begin
g_sum:=sum;
releaseMutex(mutex);//解除互斥关系
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
mutex:=CreateMutex(nil,false,nil);
TThreadA.Create(false);
TThreadB.Create(false); //A执行完,B执行,主线程显示结果
if WaitForSingleObject(mutex,infinite) =WAIT_OBJECT_0 then //主线程申请占有互斥对象
showmessage(inttostr(g_sum));
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
closeHandle(mutex);
end;end.
var hMutex: THandle; {应该先声明一个全局的互斥句柄}
CreateMutex {建立一个互斥对象}
WaitForSingleObject {用等待函数排队等候}
ReleaseMutex {释放拥有权}
CloseHandle {最后释放互斥对象}那里出了点小问题?
begin
mutex:=CreateMutex(nil,false,nil);
TThreadA.Create(false);
TThreadB.Create(false); //A执行完,B执行,主线程显示结果
closeHandle(mutex);
//if WaitForSingleObject(mutex,infinite) =WAIT_OBJECT_0 then //主线程申请占有互斥对象
sleep(20000);
showmessage(inttostr(g_sum));
end;