AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Cross-Platform-Entwicklung iOS [Seattle] THttpClient - Abbruch im ReceiveData Event
Thema durchsuchen
Ansicht
Themen-Optionen

[Seattle] THttpClient - Abbruch im ReceiveData Event

Ein Thema von Sir Rufo · begonnen am 9. Nov 2015 · letzter Beitrag vom 9. Nov 2015
Antwort Antwort
Benutzerbild von Sir Rufo
Sir Rufo

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

[Seattle] THttpClient - Abbruch im ReceiveData Event

  Alt 9. Nov 2015, 11:29
Da wollte ich so einen schönen ImageLoader basteln, der im Hintergrund das Bild lädt und dann anzeigt ...

funktioniert super unter Windows 32/64 ... aber mit iOS/OSX kann man das knicken.
Delphi-Quellcode:
procedure TForm1.ImageLoaderHttpCLientReceiveDataEvent( const Sender: TObject; AContentLength, AReadCount: Int64; var Abort: Boolean );
begin
  FImageLoader.ReportProgress( ( AReadCount * 100 ) div AContentLength );
  Abort := FImageLoader.CancellationPending; // <- Das ist der Übeltäter
end;
Wird dieses zu schnell/zu früh gesetzt, dann wird der Request einfach nicht beendet

Komplettes Beispiel im Anhang.

Gibt es da einen sinnvollen Workaround, ausser Kopfstände mit Salto rückwärts und Schraube?

RSP-12879
Angehängte Dateien
Dateityp: zip BackgroundWorker.zip (20,0 KB, 7x aufgerufen)
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
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: [Seattle] THttpClient - Abbruch im ReceiveData Event

  Alt 9. Nov 2015, 12:07
Hast Du es mal alternativ hiermit versucht?
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

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

AW: [Seattle] THttpClient - Abbruch im ReceiveData Event

  Alt 9. Nov 2015, 12:46
Hast Du es mal alternativ hiermit versucht?
Jupp, das Verhalten bleibt aber gleich
Delphi-Quellcode:
{$DEFINE USE_REQUEST_VERSION}

procedure TForm1.ImageLoaderDoWorkEvent( Sender: TObject; e: TDoWorkEventArgs );
var
  url : string;
  http : THttpClient;
  response: IHTTPResponse;
{$IFDEF USE_REQUEST_VERSION}
  request: IHTTPRequest;
{$ENDIF}
begin
  url := e.Argument.AsString;

  http := THttpClient.Create;
  try
{$IFDEF USE_REQUEST_VERSION}
    request := http.GetRequest( sHTTPMethodGet, url );
    request.OnReceiveData := ImageLoaderHttpCLientReceiveDataEvent;
    response := http.Execute( request );
{$ELSE}
    http.OnReceiveData := ImageLoaderHttpCLientReceiveDataEvent;
    response := http.Get( url );
{$ENDIF}
    e.Result := TValue.From( response );
  finally
    http.Free;
  end;
end;
Was aber auch zu erwarten war, denn THttpClient.Get macht intern exakt das.
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
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
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#5

AW: [Seattle] THttpClient - Abbruch im ReceiveData Event

  Alt 9. Nov 2015, 13:45
Merk Dir doch die Zeit des Setzens von FFirstEvent und setze das Ende-Flag erst nach Zeitspanne x. Die ist dann sicher noch Prozessor- und OS-Versionsabhängig
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

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

AW: [Seattle] THttpClient - Abbruch im ReceiveData Event

  Alt 9. Nov 2015, 13:56
Merk Dir doch die Zeit des Setzens von FFirstEvent und setze das Ende-Flag erst nach Zeitspanne x. Die ist dann sicher noch Prozessor- und OS-Versionsabhängig
Eben darum ist ja dieser Workaround nicht das Mittel der Wahl ... denn genau diese Zeitspanne ist das Problem.
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
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:12 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz