Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   TAniIndicator stoppt immer beim TIdHTTP.Get (https://www.delphipraxis.net/179656-taniindicator-stoppt-immer-beim-tidhttp-get.html)

RWarnecke 22. Mär 2014 20:20

TAniIndicator stoppt immer beim TIdHTTP.Get
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,

ich habe in meiner Anwendung einen TAniIndicator. Dieser soll sich drehen, während die Anwendung in einem Thread über die TIdHTTP verschiedene GET-Abfragen macht. Jetzt habe ich nur das Problem, dass jedes mal bei der GET-Abfrage der TAniIndicator stoppt, obwohl ich meiner Meinung nach alles im Thread habe. Wieso wird der TAniIndicator angehalten ? Habe ich vielleicht einen Fehler in meiner TThread-Klasse ?

Als Anhang mal mein kleines Beispielprojekt.

himitsu 22. Mär 2014 20:29

AW: TAniIndicator stoppt immer beim TIdHTTP.Get
 
Lass den Thread weg, denn es ist total sinnlos, wenn du den Thread startest und das Erste, was du machst, ist die komplette Funktion sofort wieder in den Hauptthread zu synchronisieren, also dort auszuführen. :zwinker:

Lösungen:
- TIdAntiFreeze und eventuell den Thread auch ganz ausbauen.
- Oder den Download wirklich im Thread ausführen und dabei ist es nicht schlecht, wenn die Komponente auch erst im Thread erstellt wird.

PS: Ich hoff' das wird ein iOS/Android-Programm, denn im Windows gibt keiner das IdHTTP_Main frei.

Sir Rufo 22. Mär 2014 20:53

AW: TAniIndicator stoppt immer beim TIdHTTP.Get
 
Bei solchen Problemen mit Threads ist es immer das Ergebnis von diesem Vergleich wichtig kurz bevor die langlaufende Funktion ausgeführt wird:
Delphi-Quellcode:
var
  LWillFreezeUI : Boolean;

LWillFreezeUI := MainThreadId = TThread.CurrentThread.ThreadId;
// Jetzt die langlaufende Funktion aufrufen
IdHttp.Get( ... );
Der Wert der Variablen ist dann selbsterklärend ;)

himitsu 22. Mär 2014 21:08

Der Wert der Variablen ist dann selbsterklärend
 
Zitat:

Code:
LWillFreezeUI := ManThreadId = TThread.CurrentThread.ThreadId;

Nur Man?

Wenn schon, dann bitte auch noch Woman, wegen der Antidiskriminierung und so. :zwinker:


Aber ja, wir wissen schon, was du meinst. :lol:

Sir Rufo 22. Mär 2014 21:11

AW: Der Wert der Variablen ist dann selbsterklärend
 
Zitat:

Zitat von himitsu (Beitrag 1253056)
Zitat:

Code:
LWillFreezeUI := ManThreadId = TThread.CurrentThread.ThreadId;

Nur Man?

Wenn schon, dann bitte auch noch Woman, wegen der Antidiskriminierung und so. :zwinker:


Aber ja, wir wissen schon, was du meinst. :lol:

Huch, wer hat denn hier den Buchstaben gefressen?

Die :cat: schaut ganz unschuldig drein, aber das heißt ja nichts ;)

himitsu 22. Mär 2014 21:14

AW: Der Wert der Variablen ist dann selbsterklärend
 
Zitat:

Zitat von Sir Rufo (Beitrag 1253057)
Huch, wer hat denn hier den Buchstaben gefressen?

Wenn ich das nur wüsste, aber irgendwer dreht hier an einigen Schräubchen.

Wollte vorhin den Post eigentlich als PN verschicken, aber irgendwer hat mich ins falsche Fenster umgeleitet, glaub ich. :stupid:

jaenicke 22. Mär 2014 22:53

AW: TAniIndicator stoppt immer beim TIdHTTP.Get
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von himitsu (Beitrag 1253051)
- TIdAntiFreeze und eventuell den Thread auch ganz ausbauen.

Unter iOS und Android müssen längere Operationen im Thread ausgeführt werden, deshalb fällt diese Option schon einmal weg. Denn auch mit AntiFreeze kann die GUI zumindest unter Windows noch stocken (unter Android habe ich es noch nie ohne Thread überhaupt ausprobiert).

Aber im Anhang mal ein Beispiel wie es richtig funktioniert. Ob das so am sinnvollsten ist, muss man am konkreten Fall schauen.

himitsu 23. Mär 2014 00:11

AW: TAniIndicator stoppt immer beim TIdHTTP.Get
 
TIdAntiFreeze kann auch nicht vorm totalen "Einfrieren" schützen, denn es macht im Grunde nichts Anders, als sich quasi ins TIdHTTP.OnWork reinzuhängen und dort ein Application.ProgressMessages aufzurufen.
OnWork wird nunmal nur beim Empfang von Datenblöcken aufgerufen und wenn der Empfang nun langsam ist oder gar hängt, dann kann das nichts machen, bis ein eventuelles TimeOut die Verbindung trennt oder doch nochmal was rein kommt.

RWarnecke 23. Mär 2014 18:33

AW: TAniIndicator stoppt immer beim TIdHTTP.Get
 
Danke an alle, für die Tipps, einige davon werde ich in meine nächsten Apps mit einfließen lassen. Ich habe es jetzt so gelöst, dass der Thread die ganze Arbeit macht und erst wenn diese Fertig ist, werden die relevanten Daten an den MainThread zurückgegeben.


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