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.

解决方案 »

  1.   

    使用过程:
    var hMutex: THandle; {应该先声明一个全局的互斥句柄}
    CreateMutex     {建立一个互斥对象}
    WaitForSingleObject {用等待函数排队等候}
    ReleaseMutex     {释放拥有权}
    CloseHandle     {最后释放互斥对象}那里出了点小问题?
      

  2.   

    你的主线程在创建线程之后就执行WaitForSingleObject,这时线程很可能还没有执行完,所以取得的g_sum不是最终结果。如果此时线程还没有开始执行,g_sum就是0。
      

  3.   

    不是这个原因你的主线程在创建线程之后就执行WaitForSingleObject,这时线程很可能还没有执行完,所以取得的g_sum不是最终结果。如果此时线程还没有开始执行,g_sum就是0。我改为这样测试还是看不到结果procedure TForm1.Button1Click(Sender: TObject);
    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;
      

  4.   

    你closeHandle(mutex)之后,WaitForSingleObject(mutex,infinite)=WAIT_OBJECT_0就不会成立了。