多线程程序中,线程中是否可以安全的使用TStringList??(50分)

  • 主题发起人 主题发起人 tomm
  • 开始时间 开始时间
T

tomm

Unregistered / Unconfirmed
GUEST, unregistred user!
多线程程序中,线程中是否可以安全的使用TStringList??
如不行,应如何做???????/
 
TStringList和线程安全有什么关系吗?
 
还是用pchar(stringlist1.text)来做吧, 然后再用stringlist2.text:=strpas(pchar1)
来转换成tstringlist处理.
 
TList不是线程安全的,不知Tstringlist是不是??
 
通过Synchronize(MyFunc) 在MyFunc里再处理TStringList就是
安全的了。
 
to Fencer:
我试过,照您的方法一运行程序就死锁,过一会才有反应,跟单线程程序没区别,
 
我也使用Synchronize(MyFunc);
TStringList是从主程序传入的,没有问题啊。
 
我发现在线程中Tstringlist中的数据正常,线程一结束Tstringlist中的数据就不
正常了。
 
把你的程序写的详细点贴上来。
 
比较好的方法是用TThreadList, 可是比TStringList要烦一点(要看程序中你对string的倚重了)
 
我实验的程序是正常的。最好将你们不正常的程序贴上来。
下面是我实验的程序:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Unit2;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormClose(Sender: TObject;
var Action: TCloseAction);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
T:TTryThread;
end;

var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
T:=TTryThread.Create;
T.Resume;
Button1.Enabled:=False;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Memo1.Lines.Text:=T.S.Text;
end;

procedure TForm1.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
T.Free;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
T.S.Clear;
Memo1.Clear;
end;

end.


unit Unit2;
interface
uses
Classes, SysUtils, Windows,syncobjs;
type
TTryThread = class(TThread)
private
{ Private declarations }
protected
procedure Execute;
override;
public
S:TStringList;
E:TSimpleEvent;
i:Integer;
constructor Create;
destructor Destroy;override;
end;

implementation
procedure TTryThread.Execute;
begin
while not Terminateddo
begin
S.Add(IntToStr(i));
E.WaitFor(1);
Inc(i);
end;
end;
constructor TTryThread.Create;
begin
Inherited Create(True);
S:=TStringList.Create;
E:=TSimpleEvent.Create;
i:=0;
end;

destructor TTryThread.Destroy;
begin
S.Free;
E.Free;
inherited Destroy;
end;
end.


 
对TstringList的操作要同步线程.
同意Fencer.
如一个Thread对TstringList.一个String修改,
另一个Thread同时把此String给删除了,自然会出问题.
 
我觉得还是用 信号灯 好一些
总用vcl主线程的话, 多线程的优势
会弱很多
 
接受答案了.
 
后退
顶部