Die Implementation würde schneller gehen und vom Ablauf her wäre der Unterschied zu TThreadList nur marginal...
Beides ist definitv nicht die beste Lösung...
Delphi-Quellcode:
procedure TWorkThread.FetchInput_SHARED;
begin
EnterCriticalSection(MyCritSect);
if FOwner.FInputLines_SHARED.Count > 0 then
begin
FInputLines_SHARED.Assign(FOwner.FInputLines_SHARED);
FOwner.FInputLines_SHARED.Clear;
end;
LeaveCriticalSection(MyCritSect);
end;
Wie man sieht, passiert nicht viel: Enthält der Puffer der VC Strings, dann werden sie übernommen und danach gelöscht.
Delphi-Quellcode:
procedure TWorkThread.SendOutput_SHARED;
begin
EnterCriticalSection(MyCritSect);
if Assigned(FOwner.FOutputLines_SHARED) then
begin
FOwner.FOutputLines_SHARED.BeginUpdate;
if FOwner.FOutputLines_SHARED.Count = 0 then
begin
if (FOutputType = otEntireLine) then
FOwner.FOutputLines_SHARED.Add(FOutputStr)
else
FOwner.FOutputLines_SHARED.Text := FOutputStr;
end
else
begin
// change the way to add by last addstring type
if FLineBeginned then
FOwner.FOutputLines_SHARED[FOwner.FOutputLines_SHARED.Count - 1] := FOutputStr
else
FOwner.FOutputLines_SHARED.Add(FOutputStr);
end;
FOwner.FOutputLines_SHARED.EndUpdate;
end;
FLineBeginned := (FOutputType = otBeginningOfLine);
LeaveCriticalSection(MyCritSect);
end;
Zusätzlich musst du noch MyCritSect vom Typ TRTLCriticalSection definieren und
implementation
var
MyCritSect : TRTLCriticalSection;
...
initialization
InitializeCriticalSection(MyCritSect);
finalization
DeleteCriticalSection(MyCritSect);
einfügen.
Das sollte für dich nur ein Test sein. Für eine richtige implementation ist das ein wenig unschön. Damit hast du dann quasi den Ersatz für die TThreadList geschaffen.
constructor Create( AOwner: TDosCommand ); <- warum TDosCommand, wenn man fragen darf?