16,749
社区成员
发帖
与我相关
我的任务
分享
unit Unit13;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, SyncObjs;
type
INumberGenerator = interface
['{C44CFFF2-D977-4388-B37D-F2BE324C967A}']
function Finished : Boolean;
function GenerateNextNumber: Integer;
end;
TForm13 = class(TForm, INumberGenerator)
btn1: TButton;
lst1: TListBox;
btn2: TButton;
btn3: TButton;
procedure FormCreate(Sender: TObject);
procedure btn1Click(Sender: TObject);
procedure btn2Click(Sender: TObject);
procedure btn3Click(Sender: TObject);
private
fNumber : integer;
{ Private declarations }
public
function GenerateNextNumber: Integer;
function Finished: Boolean;
{ Public declarations }
end;
TNumExportThread = class(TThread)
private
fList: TStrings;
fNumberGenerator: INumberGenerator;
procedure DoExportNumber;
protected
procedure Execute; override;
public
constructor Create(const list: TStrings; const numberGenerator: INumberGenerator);
end;
var
Form13: TForm13;
implementation
{$R *.dfm}
procedure TForm13.btn1Click(Sender: TObject);
var
i: integer;
generator: INumberGenerator;
begin
generator := Self as INumberGenerator;
for I := 1 to 5 do
TNumExportThread.Create(lst1.Items, generator);
end;
procedure TForm13.btn2Click(Sender: TObject);
var
i: integer;
begin
// 最简单的方式, 不用线程 效率也是最高的.
lst1.Items.BeginUpdate;
try
for i := 0 to 10000 - 1 do begin
lst1.Items.Add(IntToStr(i));
end;
finally
lst1.Items.EndUpdate;
end;
end;
procedure TForm13.btn3Click(Sender: TObject);
begin
ShowMessage(IntToStr(lst1.Items.Count));
end;
function TForm13.GenerateNextNumber: Integer;
begin
inc(fNumber);
Result := fNumber;
end;
procedure TForm13.FormCreate(Sender: TObject);
begin
fNumber := -1;
end;
{ TNumExportThread }
constructor TNumExportThread.Create(const list: TStrings; const numberGenerator: INumberGenerator);
begin
fList := list;
fNumberGenerator := numberGenerator;
FreeOnTerminate := true;
inherited Create(False);
end;
procedure TNumExportThread.DoExportNumber;
var
i : Integer;
begin
i := fNumberGenerator.GenerateNextNumber;
if not fNumberGenerator.Finished then begin
fList.Add(IntToStr(i)) ;
end;
end;
procedure TNumExportThread.Execute;
begin
while not fNumberGenerator.Finished do begin
Synchronize(DoExportNumber);
end;
end;
function TForm13.Finished: Boolean;
begin
Result := fNumber > 10000;
end;
initialization
ReportMemoryLeaksOnShutdown := true;
end.