读书人

关于多线程同步向Memo1中写数据的有关

发布时间: 2012-02-08 19:52:21 作者: rapoo

关于多线程同步向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,有时效率反而会降低
[解决办法]
最好不要用线程驱动窗口。

读书人网 >.NET

热点推荐