关于多线程同步向Memo1中写数据的有关问题()
关于多线程同步向Memo1中写数据的问题(高手请进)
以下代码
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons;
type
TMainThread = class(TThread)
private
FCount: LongInt;
procedure WriteFcout;
public
procedure Execute; override;
constructor Create(IsSuspend: Boolean);
end;
TCenterThread = class(TThread)
private
FCount: LongInt;
procedure WriteFcout;
public
procedure Execute; override;
constructor Create(IsSuspend: Boolean);
end;
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
FP: TStringList;
public
{ Public declarations }
end;
var
Form1: TForm1;
ThreadLock: LongInt;
MainThread: TMainThread;
CenterThread: TCenterThread;
implementation
{$R *.dfm}
constructor TMainThread.Create(IsSuspend: Boolean);
begin
inherited Create(IsSuspend);
FreeOnTerminate := True;
FCount := 0;
end;
procedure TMainThread.Execute;
var i: Integer;
begin
i := 0;
while i < 10 do
begin
Inc(FCount);
Synchronize(WriteFcout);
InterlockedIncrement(ThreadLock);
if CenterThread.Suspended then
CenterThread.Resume;
Inc(i);
end;
end;
procedure TMainThread.WriteFcout;
begin
Form1.Memo1.Lines.Add( 'A ');
end;
constructor TCenterThread.Create(IsSuspend: Boolean);
begin
inherited Create(IsSuspend);
FreeOnTerminate := True;
FCount := 0;
end;
procedure TCenterThread.Execute;
var i: LongInt;
begin
while not Terminated do
begin
if ThreadLock > 0 then
begin
以下代码
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons;
type
TMainThread = class(TThread)
private
FCount: LongInt;
procedure WriteFcout;
public
procedure Execute; override;
constructor Create(IsSuspend: Boolean);
end;
TCenterThread = class(TThread)
private
FCount: LongInt;
procedure WriteFcout;
public
procedure Execute; override;
constructor Create(IsSuspend: Boolean);
end;
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
FP: TStringList;
public
{ Public declarations }
end;
var
Form1: TForm1;
ThreadLock: LongInt;
MainThread: TMainThread;
CenterThread: TCenterThread;
implementation
{$R *.dfm}
constructor TMainThread.Create(IsSuspend: Boolean);
begin
inherited Create(IsSuspend);
FreeOnTerminate := True;
FCount := 0;
end;
procedure TMainThread.Execute;
var i: Integer;
begin
i := 0;
while i < 10 do
begin
Inc(FCount);
Synchronize(WriteFcout);
InterlockedIncrement(ThreadLock);
if CenterThread.Suspended then
CenterThread.Resume;
Inc(i);
end;
end;
procedure TMainThread.WriteFcout;
begin
Form1.Memo1.Lines.Add( 'A ');
end;
constructor TCenterThread.Create(IsSuspend: Boolean);
begin
inherited Create(IsSuspend);
FreeOnTerminate := True;
FCount := 0;
end;
procedure TCenterThread.Execute;
var i: LongInt;
begin
while not Terminated do
begin
if ThreadLock > 0 then
begin