您看: 这是我原来看到的别人的例子,这样同步Edit1.Text 没有出错呀
----------------------------------------------------------------------------
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
FThreads: TList;
procedure Start;
procedure Stop;
procedure ThreadOnTerminate(Sender: TObject);
end;
var
Form1: TForm1;
implementation
uses SyncObjs;
{$R *.dfm}
type
TMyThread = class(TThread)
protected
procedure Execute; override;
end;
var
Lock: TCriticalSection = nil;
procedure TMyThread.Execute;
begin
while not Terminated do
begin
Lock.Enter;
try
Form1.Edit1.Text := TimeToStr(Time);
finally
Lock.Leave;
end;
Sleep(100);
end;
end;
procedure TForm1.Start;
var
I: Integer;
Thread: TThread;
begin
Lock.Enter;
try
for I := 0 to 255 do
begin
Thread := TMyThread.Create(False);
Thread.OnTerminate := ThreadOnTerminate;
FThreads.Add(Thread);
end;
finally
Lock.Leave;
end;
end;
procedure TForm1.Stop;
var
I: Integer;
begin
Lock.Enter;
try
for I := FThreads.Count - 1 downto 0 do
TThread(FThreads).Terminate;
finally
Lock.Leave;
end;
end;
procedure TForm1.ThreadOnTerminate(Sender: TObject);
var
Index: Integer;
begin
Lock.Enter;
try
Index := FThreads.IndexOf(Sender);
if Index <> -1 then
FThreads.Delete(Index);
finally
Lock.Leave;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Start;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Stop;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Lock := TCriticalSection.Create;
FThreads := TList.Create;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Stop;
end;
end.