Registriert seit: 2. Dez 2009
Ort: München
320 Beiträge
Lazarus
|
Re: TThreadStringList
10. Mär 2010, 15:07
Hallo Klaus,
EDIT ist nicht richtig, liste ist doch geschützt. Bei Thread #8 Himitsu gehts korrekt weiter
Ja die Liste ist ohne Schutz. Die Liste darf ausserhalb der Classe nicht von mehreren Threads bearbeitet werden.
Der Zugriff muss über die Klassenmethoden erfolgen, darum locklist in den privaten Bereich verschieben, und dessen
Result (Liste) nur innerhalb der Classe verwenden.
Ich würde das in etwa so verwenden.
Delphi-Quellcode:
type
TThreadStringList = class
private
FStringList : TStringList;
FCriticalSection : TCriticalSection;
public
constructor create;
destructor destroy;
procedure Add(AItem: AnsiString);
function Get(AIdx: Integer): AnsiString;
procedure SaveToFile(AFilePath: AnsiString);
procedure Remove(AIdx: Integer);
function Count: Integer;
end;
implementation
constructor TThreadStringList.create;
begin
FCriticalSection := TCriticalSection.create;
FStringList := TStringList.Create;
end;
destructor TThreadStringList.destroy;
begin
freeAndNil(FStringList);
freeAndNil(FCriticalSection);
end;
procedure TThreadStringList.add(AItem: AnsiString);
begin
FCriticalSection.Acquire;
try
FStringList.Add(AItem);
finally
FCriticalSection.Release;
end;
end;
function TThreadStringList.get(AIdx: Integer): AnsiString;
begin
FCriticalSection.Acquire;
try
result := FStringList[AIdx];
finally
FCriticalSection.Release;
end;
end;
procedure TThreadStringList.saveToFile(AFilePath: string);
begin
FCriticalSection.Acquire;
try
FStringList.SaveToFile(AFilePath);
finally
FCriticalSection.Release;
end;
end;
procedure TThreadStringList.remove(AIdx: Integer);
begin
FCriticalSection.Acquire;
try
FStringList.Delete(AIdx);
finally
FCriticalSection.Release;
end;
end;
function TThreadStringList.count:Integer;
begin
FCriticalSection.Acquire;
try
result := FStringList.count;
finally
FCriticalSection.Release;
end;
end;
lg. Astat
Lanthan Astat 06810110811210410503210511511603209711003210010110 9032084097103
03211611111604403209711003210010110903210010510103 2108101116122
11610103209010110510810103206711110010103210511003 2068101108112
10410503210310111509910411410510109810111003211910 5114100046
|