Es wird
etwas besser, wenn man den ersten ReceiveData-Event erst einmal passieren lässt
Delphi-Quellcode:
procedure TForm1.ImageLoaderDoWorkEvent( Sender: TObject; e: TDoWorkEventArgs );
var
url :
string;
http : THttpClient;
response: IHTTPResponse;
begin
url := e.Argument.AsString;
FFirstEvent := True;
// FFirstEvent setzen
http := THttpClient.Create;
try
http.OnReceiveData := ImageLoaderHttpCLientReceiveDataEvent;
response := http.Get(
url );
e.Result := TValue.From( response );
finally
http.Free;
end;
end;
procedure TForm1.ImageLoaderHttpCLientReceiveDataEvent(
const Sender: TObject; AContentLength, AReadCount: Int64;
var Abort: Boolean );
begin
FImageLoader.ReportProgress( ( AReadCount * 100 )
div AContentLength );
Abort :=
not FFirstEvent
and FImageLoader.CancellationPending;
FFirstEvent := False;
// FFirstEvent zurücksetzen
end;
und wenn man eine
Zeit-Bremse einbaut, dann geht es mit dem Stress-Test auch (weil jetzt aber auch nicht mehr gestresst wird
)
Delphi-Quellcode:
procedure TForm1.ImageLoaderDoWorkEvent( Sender: TObject; e: TDoWorkEventArgs );
var
url :
string;
http : THttpClient;
response: IHTTPResponse;
begin
url := e.Argument.AsString;
FFirstEvent := True;
Sleep( 500 );
// Sleeping Time
if FImageLoader.CancellationPending
then
begin
e.Cancel := True;
Exit;
end;
http := THttpClient.Create;
try
http.OnReceiveData := ImageLoaderHttpCLientReceiveDataEvent;
response := http.Get(
url );
e.Result := TValue.From( response );
finally
http.Free;
end;
end;
Das sind aber genau diese seltsamen Workarounds, die ich eigentlich nicht haben möchte. Denn welche Zeitspanne muss ich denn konkret warten, damit es immer stabil funktioniert?
Da haben wir ein schönes Timing-Problem auf den OSX/iOS Plattformen. Und da es durchgängig ist, ist hier wohl die EMBA-Implementierung falsch.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ea 0a 4c 14 0d b6 3a a4 c1 c5 b9
dc 90 9d f0 e9 de 13 da 60)