unit Unit1; interfaceuses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, System.Generics.Collections; type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; Memo2: TMemo; Memo3: TMemo; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); privatepublic{ Public declarations }end; var Form1: TForm1; implementation{$R *.dfm}uses System.Threading, System.SyncObjs, System.Diagnostics; procedure TForm1.Button1Click(Sender: TObject); const C = 1000; var TaskArray: arrayof ITask; I: Integer; ATask: ITask; begin Button1.Enabled := False; Memo1.Clear; Memo2.Clear; Memo3.Clear; SetLength(TaskArray, C); for I := 0to C - 1dobegin TaskArray[I] := TTask.Create(procedurevar Id: string; begin Id := TThread.Current.ThreadID.ToString; TThread.Queue(nil, procedurebeginif Memo1.Lines.IndexOf(Id)=-1then Memo1.Lines.Add(Id); //Memo2.Lines.Add( IntToStr(Memo2.Lines.Count+1) );end); end); TaskArray[I].Start; end; TThread.CreateAnonymousThread(procedurevar I: Integer; Task: ITask; J: Integer; begin I := C; while I > 0dobeginfor Task in TaskArray doif Task.Status = TTaskStatus.Completed then Dec(I); end; TThread.Synchronize(nil, procedurebegin Memo1.Lines.Add('OK'); Button1.Enabled := True; end); //否则有内存泄漏for J := 0to C - 1do TaskArray[J] := nil; end).Start; if TTask.WaitForAll(TaskArray) then Memo1.Lines.Add('WaitForAll'); end;
procedure TForm1.FormCreate(Sender: TObject); begin ReportMemoryLeaksOnShutdown := True; end; end.
输出结果
1WaitForAll 2712037064470525OK 63272
有时候,输出结果是:
1WaitForAll 270643712043272570526 OK
测试结果: