关于多线程同步向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
InterlockedDecrement(ThreadLock);
Inc(FCount);
Synchronize(WriteFcout);
end
else
Suspend;
end;
end;
procedure TCenterThread.WriteFcout;
begin
Form1.Memo1.Lines.Add( 'B ');
end;
procedure TForm1.Button1Click(Sender: TObject);
var i: LongInt;
begin
if MainThread.Suspended then
MainThread.Resume;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
MainThread.Terminate;
CenterThread.Terminate;
end;
procedure TForm1.FormShow(Sender: TObject);
begin
MainThread := TMainThread.Create(True);
CenterThread := TCenterThread.Create(True);
ThreadLock := 0;
end;
end.
按 Button1后得 Memo1中得到结果如下。
A
B
A
A
A
A
A
A
A
A
A
请问是什么原因
理想结果应该是10个A,10个B 交替出现,但是在只有10个A、1个B 请问是什么原因
[解决办法]
你把ThreadLock的值打印出来就知道是怎么回事了。
[解决办法]
同步:Synchronize
[解决办法]
procedure TCenterThread.Execute;
var i: LongInt;
begin
while not Terminated do
begin
if ThreadLock > 0 then
begin
Sleep(1);
Inc(FCount);
Synchronize(WriteFcout);
InterlockedDecrement(ThreadLock);
if MainThread.Suspended then
MainThread.Resume;
Suspend;
end
end;
end;
procedure TMainThread.Execute;
var i: Integer;
begin
i := 0;
while i < 10 do
begin
Sleep(1);
Inc(FCount);
Synchronize(WriteFcout);
InterlockedIncrement(ThreadLock);
if CenterThread.Suspended then
CenterThread.Resume;
Inc(i);
Suspend;
end;
end;
[解决办法]
并不是用了多线程就会提高程序的效率,如果不是多cpu,有时效率反而会降低
[解决办法]
最好不要用线程驱动窗口。