unit Main;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;type
  TMainForm = class(TForm)
    Button1: TButton;
    ListBox1: TListBox;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    procedure ThreadsDone(Sender: TObject);
  public
    { Public declarations }
  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;
  hSem: THandle = 0;function GetNextNumber: Integer;
begin
  Result := NextNumber;
  Inc(NextNumber);
end;{ TFooThread }procedure TFooThread.Execute;
var
  i: Integer;
  WaitReturn: DWORD;
begin
  OnTerminate := MainForm.ThreadsDone;
  WaitReturn := WaitForSingleObject(hSem,INFINITE);
  if WaitReturn = WAIT_OBJECT_0 then
  begin
    for i := 1 to MaxSize do
    begin
      GlobalArray[i] := GetNextNumber;
      Sleep(5);
    end;
  end;
  ReleaseSemaphore(hSem,1,nil);
end;{ TMainForm }procedure TMainForm.Button1Click(Sender: TObject);
begin
  hSem := CreateSemaphore(nil,1,1,nil);
  TFooThread.Create(False);
  TFooThread.Create(False);
end;procedure TMainForm.ThreadsDone(Sender: TObject);
var
  i: Integer;
begin
  Inc(DoneFlags);
  if DoneFlags = 2 then
  begin
    for i := 1 to MaxSize do
    begin
      Listbox1.Items.Add(IntToStr(GlobalArray[i]));
      CloseHandle(hSem);
    end;
  end;
end;end.

解决方案 »

  1.   

    请各位帮忙看看,这是为什么呢?当在Delphi2007开发环境中按F9运行会出现错误,可是到编译后的路径下直接运行EXE文件,系统没有出现错误提示,而且运行正常。
      

  2.   

    为什么每次大侠们回答问题时,我都是自己找到了问题的原因呢?
    代码中的这一段出现问题:
        for i := 1 to MaxSize do
          //原来这里有begin      会出现错误,很奇怪,为什么?
          Listbox1.Items.Add(IntToStr(GlobalArray[i]));
          CloseHandle(hSem);
          //原来这里有end;
    估计是释放资源出现了问题。
      

  3.   

    有begin end的话CloseHandle操作会执行MaxSize次.    for i := 1 to MaxSize do 
        begin 
          Listbox1.Items.Add(IntToStr(GlobalArray[i])); 
          CloseHandle(hSem); 
        end;