Mehrere in Fibern ausgeführte Prozeduren müssten doch langsamer sein, als einfach mehrere Prozeduren in einem Thread nacheinander aufzurufen?
Der einzige Vorteil, den ich da seh, daß man den Fiber einfach mal so mittendrin anhalten könnte, aber einen Thread kann man ja genauso gut anhalten. (auch wenn man das eigentlich nicht machen sollte, was dabei allerdings auch für die Fiber gilt)
Nachteil, man zerschießt sich die automatische Speicherverwaltung.
Das fängt im Delphi schon bei den Strings, dyn. Arrays, Interfaces und Variants an, und geht im NextGen bei allen Objekten weiter. (hatte hier gestern gelesen, daß man versucht Fiber auch in anderen Platformen haben will)
Die winzige Lösung, welche ich sehe, daß sich Fiber nicht einfach so selber beenden dürfen.
Man könnte die aufgerufenen Prozeduren in eine leere Dummy-Procedure legen, wo nur der Aufruf der Funktion drin ist und sonst nichts, was irgendwie Speicher oder die Exceptionbehandlung beinhalten sollte (außer eventuell genau an Fiber angepasste Funktionen). Also genauso wie beim TThread.Execute.
PS: Sobald auch nur eine lokale String-Variable in einer Funktion deklariert wurde, egal ob manuell oder durch soeine interne Variable, wird auch noch ein Try-Finally dort eingebaut.
Dieser Code
Delphi-Quellcode:
procedure Test;
var
s1,s2: String;
i: Integer;
begin
i := 123;
s1 := IntToStr(I);
GetDynVarPrms(s1);
s2 := I.ToString;
GetDynVarPrms(s2);
end;
wird, so in etwa, in Folgendes übersetzt (grob in Pure-Pascal übersetzt)
Delphi-Quellcode:
procedure Test;
var
intern : record
s1, s2, intern_s3: String;
i: Integer;
end;
begin
{$REGION 'begin'}
PushVariablesToStack(intern); // inkl. Initialize(intern); , indem die String-Variablen mit 0 beschrieben werden
try
with intern do begin
{$ENDREGION}
i := 123;
IntToStr(I, s1); // procedure IntToStr(i: Integer; var Result: string);
GetDynVarPrms(s1);
TIntegerHelper.ToString(i, intern_s3); //intern_s3 := I.ToString; // procedure TIntegerHelper.ToString(Value: Integer; var Result: string); inline;
UStrLAsg(s2, intern_s3); //s2 := intern_s3;
GetDynVarPrms(s2);
// und hier hat dein Fiber alles weggeknallt
{$REGION 'end'}
end;
finally
Finalize(intern);
end;
PopVariablesFromStack(intern);
{$ENDREGION}
end;