首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

关于多线程同步向Memo1中写数据的有关问题()

2012-02-08 
关于多线程同步向Memo1中写数据的问题(高手请进)以下代码unitUnit1interfaceusesWindows,Messages,SysUti

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

热点排行