用TCriticalSession或Mutex都可以,原理和全局变量差不多吧

解决方案 »

  1.   

    unit Main;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;type
      TMainForm = class(TForm)
        Button1: TButton;
        ListBox1: TListBox;
        procedure Button1Click(Sender: TObject);
      private
        procedure ThreadsDone(Sender: TObject);
      end;  TFooThread = class(TThread)
      protected
        procedure Execute; override;
      end;var
      MainForm: TMainForm;implementation{$R *.DFM}const
      MaxSize = 128;var
      NextNumber: Integer = 0;
      DoneFlags: Integer = 0;
      GlobalArray: array[1..MaxSize] of Integer;
      hMutex: THandle = 0;function GetNextNumber: Integer;
    begin
      Result := NextNumber;  
      Inc(NextNumber);       
    end;procedure TFooThread.Execute;
    var
      i: Integer;
    begin
      FreeOnTerminate := True;
      OnTerminate := MainForm.ThreadsDone;
      if WaitForSingleObject(hMutex, INFINITE) = WAIT_OBJECT_0 then
      begin
        for i := 1 to MaxSize do
        begin
          GlobalArray[i] := GetNextNumber;  
          Sleep(5);                         
        end;
      end;
      ReleaseMutex(hMutex);
    end;procedure TMainForm.ThreadsDone(Sender: TObject);
    var
      i: Integer;
    begin
      Inc(DoneFlags);
      if DoneFlags = 2 then    
      begin
        for i := 1 to MaxSize do
          { fill listbox with array contents }
          Listbox1.Items.Add(IntToStr(GlobalArray[i]));
        CloseHandle(hMutex);
      end;
    end;procedure TMainForm.Button1Click(Sender: TObject);
    begin
      hMutex := CreateMutex(nil, False, nil);
      TFooThread.Create(False);  
      TFooThread.Create(False);
    end;end.