Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi IdHTTP get in Thread ausführen? (https://www.delphipraxis.net/190390-idhttp-get-thread-ausfuehren.html)

BBoy 29. Sep 2016 12:51


IdHTTP get in Thread ausführen?
 
Ich habe folgende Anwendung:
Bei einem Klick auf eine Google Maps Karte werden die Koordinaten in eine URL eingebaut und an eine Internetseite geschickt. Als response kommt ein json string.

Hier meine Abfrage:
Code:
procedure tform1.get_results;
begin
  idhttp1.Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36';
  idhttp1.Request.Accept := 'application/json, text/javascript, */*; q=0.01';
  idhttp1.Request.CustomHeaders.Add('origin: https:jsontest.de');
  idhttp1.Request.CustomHeaders.Add('authority: api.jsontest.de');

  result_string := idhttp1.Get('https://api.jsontest.de/?lat=49.834227128096916&lng=8.588504446191408');

  form1.create_results; // Hier wird der String dann aufgearbeitet und es wird ein marker auf die Karte gesetzt
end;
Packe ich das nun in ein OnButtonClick ereignis passiert folgendes:
Ich klicke auf die Karte und es scheint nichts zu passieren für ca. 20 Sekunden, dann erscheint erst der Marker und der Kreis. Diese Wartezeit liegt wohl daran das die response manchmal etwas dauert.
Das finde ich störend, es sollte erst der Marker und der Kreis erscheinen.
Der Rest funktioniert einwandfrei!

Also kam ich auf die idee die http get Abfrage in einen Thread einzubauen.
Sieht genau so aus, nur eben am Anfang mit:
Code:
procedure TMyThread.Execute;
begin

Der Marker un der Kreis tauchen nun sofort auf aber im weiteren verlauf gibt es Probleme mit der Zeile:
Code:
    Marker.Latitude := strtofloat(lat);
Es ist aber egal welche Marker.xxx Zeile da steht. Er hat immer ein Problem nach dieser Zeile:
Code:
Marker := GMaps1.Markers.Add;
Gestartet wird der Thread in OnMapClick ereignis der Karte:
Code:
MyThread := TMyThread.Create(true);
mythread.Resume;
Definiert wurde der thread so:
Code:
type
  TMyThread = class(TThread)
    procedure Execute; override;
  end;
Dieses Problem hat er aber nur wenn ich das mit einem Thread mache, sonst funktioniert es. Daher bin ich mir sicher das der Fehler wegen dem thread ausgelöst wird. Das finde ich komisch. Woran könnte das liegen? Und wie bekomme ich diese Wartezeit weg bis der Marker und der Kreis erscheinen?

.

TiGü 29. Sep 2016 15:47

AW: IdHTTP get in Thread ausführen?
 
Steht bei dir im Execute des Threads sowas wie:

Delphi-Quellcode:
procedure TMyThread.Execute;
begin
form1.idhttp1.Request.UserAgent...
end;

Dann ist das grundsätzlich verkehrt. Du musst die Instanz von der Indy-HTTP-Komponente im Execute erzeugen.

stahli 29. Sep 2016 16:08

AW: IdHTTP get in Thread ausführen?
 
Schau mal, ob Dir das Video hilft: https://www.youtube.com/watch?v=Jhcpgjs1uPA
(Ist thematisch auf jeden Fall in der Nähe.)

BBoy 29. Sep 2016 16:32

AW: IdHTTP get in Thread ausführen?
 
Danke euch beiden, hat weiter geholfen :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:35 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