Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: [Seattle] THttpClient - Abbruch im ReceiveData Event

  Alt 9. Nov 2015, 13:12
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)
  Mit Zitat antworten Zitat