同时删除/添加肯定要同步吧。
但我的程序仅仅有 tstringlist.add 操作。不用同步可以吧?探讨下!
11 个解决方案
#1
不排序的话没问题
#2
只有添加,不删除,或是取值的话没什么问题。
#3
只存在添加的话,不用
#4
多线程操作list使用TThreadList,里面有lock/unlock方法
#5
总需要取值的吧?还是需要同步
#6
添加的时候要同步
#7
Add 作为并发写..不需要同步? 不太可能...
#8
经测试,不用同步。一点问题都没!
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
Tmythead = class( TThread )
private
FStr : string;
protected
{ Protected declarations }
procedure Execute; override;
public
{ Public declarations }
constructor Create(CreateSuspended: Boolean = false; AStr:String = 't1');
end;
implementation
uses
Unit1;
{ TThreadEWB }
constructor Tmythead.Create(CreateSuspended: Boolean; AStr:String);
begin
FStr := AStr;
FreeOnTerminate := true;
inherited Create(CreateSuspended);
end;
procedure Tmythead.Execute;
var
i : integer;
begin
i := 0;
while i < 5000 do
begin
Unit1.sl1.Duplicates := dupIgnore;
Unit1.sl1.Add(FStr + ' : ' + inttostr(i));
inc(i);
end;
Form1.Memo1.Lines.Add('完成 : ' + FStr);
end;
end.
#9
你这样测试能测试出来么?
就一个线程在这里跑 ,里边不过就一个循环
就一个线程在这里跑 ,里边不过就一个循环
#10
还有代码没发!
procedure TForm1.Button6Click(Sender: TObject);
var
t1, t2, t3, t4, t5, t6 : Tmythead;
begin
sl1 := TStringList.Create;
t1 := Tmythead.Create(false, 't1');
t2 := Tmythead.Create(false, 't2');
t3 := Tmythead.Create(false, 't3');
t4 := Tmythead.Create(false, 't4');
t5 := Tmythead.Create(false, 't5');
t6 := Tmythead.Create(false, 't6');
end;
#11
TStringList.Add操作必须要处理同步,具体操作,参考4楼大侠的意见
研究一下TStringList.Add的实现过程就知道了,D7,D2010里面的实现过程看,必须要加上
研究一下TStringList.Add的实现过程就知道了,D7,D2010里面的实现过程看,必须要加上
#1
不排序的话没问题
#2
只有添加,不删除,或是取值的话没什么问题。
#3
只存在添加的话,不用
#4
多线程操作list使用TThreadList,里面有lock/unlock方法
#5
总需要取值的吧?还是需要同步
#6
添加的时候要同步
#7
Add 作为并发写..不需要同步? 不太可能...
#8
经测试,不用同步。一点问题都没!
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
Tmythead = class( TThread )
private
FStr : string;
protected
{ Protected declarations }
procedure Execute; override;
public
{ Public declarations }
constructor Create(CreateSuspended: Boolean = false; AStr:String = 't1');
end;
implementation
uses
Unit1;
{ TThreadEWB }
constructor Tmythead.Create(CreateSuspended: Boolean; AStr:String);
begin
FStr := AStr;
FreeOnTerminate := true;
inherited Create(CreateSuspended);
end;
procedure Tmythead.Execute;
var
i : integer;
begin
i := 0;
while i < 5000 do
begin
Unit1.sl1.Duplicates := dupIgnore;
Unit1.sl1.Add(FStr + ' : ' + inttostr(i));
inc(i);
end;
Form1.Memo1.Lines.Add('完成 : ' + FStr);
end;
end.
#9
你这样测试能测试出来么?
就一个线程在这里跑 ,里边不过就一个循环
就一个线程在这里跑 ,里边不过就一个循环
#10
还有代码没发!
procedure TForm1.Button6Click(Sender: TObject);
var
t1, t2, t3, t4, t5, t6 : Tmythead;
begin
sl1 := TStringList.Create;
t1 := Tmythead.Create(false, 't1');
t2 := Tmythead.Create(false, 't2');
t3 := Tmythead.Create(false, 't3');
t4 := Tmythead.Create(false, 't4');
t5 := Tmythead.Create(false, 't5');
t6 := Tmythead.Create(false, 't6');
end;
#11
TStringList.Add操作必须要处理同步,具体操作,参考4楼大侠的意见
研究一下TStringList.Add的实现过程就知道了,D7,D2010里面的实现过程看,必须要加上
研究一下TStringList.Add的实现过程就知道了,D7,D2010里面的实现过程看,必须要加上