unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;type
MyThread = class(TThread)
Fstr : string;
FMemo : TMemo;
constructor create(memo : TMemo; str : string);
procedure Execute; override;
end;
var
Form1: TForm1;
flag : boolean;implementation{$R *.dfm}constructor MyThread.create(memo : TMemo; str : string);
begin
inherited create(true);
FreeOnTerminate := true;
FStr := str;
FMemo := Memo;
//Resume;
end;procedure MyThread.Execute;
begin
while flag do Fmemo.Lines.Add(FStr);
sleep(1);
end;procedure TForm1.Button1Click(Sender: TObject);
var
MyTh : MyThread;
begin
flag := true;
MyTh := MyThread.create(self.Memo1, 'aaaaaaaaaaaaa');
myth.Resume;
MyTh := MyThread.create(self.Memo1, 'bbbbbbbbbbbbb');
myth.Resume;
MyTh := MyThread.create(self.Memo1, 'ccccccccccccc');
myth.Resume;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
flag := false;
end;end.
以上代码测试时,MEMO滚动条设为BOTH,运行中,用鼠标向上选择里面的内容,有时就会出现添加行乱了。我需要在多线程中向MEMO添加或更改行,在我的程序里,我在主线程和其它创建的线程中都使用同一个TCRITICALSECTION或MUTEX,但是还是在MEMO操作时乱了,有什么办法解决啊?我使用的是D6
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;type
MyThread = class(TThread)
Fstr : string;
FMemo : TMemo;
constructor create(memo : TMemo; str : string);
procedure Execute; override;
end;
var
Form1: TForm1;
flag : boolean;implementation{$R *.dfm}constructor MyThread.create(memo : TMemo; str : string);
begin
inherited create(true);
FreeOnTerminate := true;
FStr := str;
FMemo := Memo;
//Resume;
end;procedure MyThread.Execute;
begin
while flag do Fmemo.Lines.Add(FStr);
sleep(1);
end;procedure TForm1.Button1Click(Sender: TObject);
var
MyTh : MyThread;
begin
flag := true;
MyTh := MyThread.create(self.Memo1, 'aaaaaaaaaaaaa');
myth.Resume;
MyTh := MyThread.create(self.Memo1, 'bbbbbbbbbbbbb');
myth.Resume;
MyTh := MyThread.create(self.Memo1, 'ccccccccccccc');
myth.Resume;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
flag := false;
end;end.
以上代码测试时,MEMO滚动条设为BOTH,运行中,用鼠标向上选择里面的内容,有时就会出现添加行乱了。我需要在多线程中向MEMO添加或更改行,在我的程序里,我在主线程和其它创建的线程中都使用同一个TCRITICALSECTION或MUTEX,但是还是在MEMO操作时乱了,有什么办法解决啊?我使用的是D6
在线程里加入函数
procedure AddLog;实现
procedure MyThread.Addlog;
begin
Fmemo.Lines.Add(FStr);
sleep(1);
end;
execute函数修改如下:procedure MyThread.Execute;
begin
while flag do Synchronize(AddLog);
sleep(1);
end;
可以改为:线程把数据/信息放在一个变量里,主form通过定时器事件去取变量,决定加什么内容到memo
不要用mutex,那个是进程级的,速度比较慢
Criticalsection是线程级的
EnterCriticalSection在主线程中是无效的,自己看看吧