终于发现Tstringlist不是线程安全的(50)

  • 主题发起人 令狐小侠
  • 开始时间

令狐小侠

Unregistered / Unconfirmed
GUEST, unregistred user!
unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Memo1: TMemo;
Button1: TButton;
Button2: TButton;
procedure FormShow(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private { Private declarations } public { Public declarations } end;
TAdd1= class(Tthread) fstringlist : Tstringlist;
protected procedure Execute;override;
procedure Assign;
public Constructor Create;
end;
Tadd2 = class(Tthread) i : int64;
protected procedure Execute;override;
public end;
var Form1: TForm1;
add1 : Tadd1;
add2 : Tadd2;implementation{$R *.dfm}{ TAdd1 }procedure TAdd1.Assign;
begin
form1.Memo1.Lines.add(fstringlist[0]);
end;
constructor TAdd1.Create;
begin
inherited create(true);
fstringlist := Tstringlist.Create;
end;
procedure TAdd1.Execute;
begin
while not self.Terminateddo
begin
if Fstringlist.Count>0 then
begin
self.Synchronize(assign);
fstringlist.Delete(0);
end else
sleep(10);
end;
end;
{ Tadd2 }procedure Tadd2.Execute;var stri : string;
begin
i :=0;
while not self.Terminateddo
begin
inc(i);
stri:= inttostr(i);
add1.fstringlist.Add(stri);
sleep(1);
end;
end;
procedure TForm1.FormShow(Sender: TObject);
begin
Add1 := Tadd1.Create;
add2 := TAdd2.Create(true);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Add1.Resume;
add2.Resume;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
add1.Suspend;
add2.Suspend;
end;
end.
//大家运行一下就知道 怎么回事了
 
D7运行无任何问题
 
单核cpu即使运行多线程 也很难出问题自己同步下就行了
 
肯定不是线程安全的.要自己做线程同步
 
这个肯定不会是线程安全的,一个类要实现线程安全,需要很多额外的资源同步开销,影响性能。作为通用类,肯定要优先考虑大部分的使用状况。
 
恭喜你发现VCL资源是现成不安全的。
 
Tstirnglist 是否线程 安全..再网上 搜了好就..也没个定论..我就在这 定了吧...
 

Similar threads

I
回复
0
查看
562
import
I
I
回复
0
查看
514
import
I
I
回复
0
查看
616
import
I
I
回复
0
查看
708
import
I
I
回复
0
查看
602
import
I
顶部