2017-02-19 4 views
0

Ich verwende Delphi 10.1 Berlin Update und Indys TIdHttp-Komponente. ich abbrechen in der Regel eine Verbindung mit dem folgenden Code:Delphi FireMonkey Indy TIdHttp wie abbrechen?

procedure TMyThread.OnWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: int64); 
begin 
    if abort then (asender as tidhttp).Disconnect; 
end; 

Dies in einer VCL-Anwendung funktioniert gut, auch in einer Anwendung Firemonkey, so lange die Windows-Plattform ist. Wenn ich diesen Code mit MacOS als Ziel verwende, schließe ich meine Anwendung sofort ohne Fehlermeldung oder irgendetwas angezeigt.

Also meine Frage hier ist, was mache ich falsch, und wie kann ich eine Verbindung abbrechen, wenn die Plattform MacOS ist?

+0

FireMonkey wurde seit Jahren mit Ausnahmeproblemen auf OSX geplagt. Es gibt zahlreiche Berichte in QualityCentral, die sich auf Laufzeitfehler 231 beziehen. AFAIK, eine Hauptursache, wurde nie gefunden, wurde aber als Problem erkannt. –

+0

Verwenden Sie modernen THTTPClient anstelle von Indy – Zam

+0

@Zam - Ich muss bei Indy bleiben, ich kann die riesige Menge an Funktionen für etwas anderes nicht ändern. – Softtouch

Antwort

0

versuchen wie folgt aus:

procedure TMyThread.OnWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: int64); 
begin 
    try 
    if abort then (asender as tidhttp).Disconnect; 
    except 
    end; 
end; 
+0

Danke, aber das hilft nicht. Auf dem Mac wird es eine erwartete Ausnahme verursachen, aber die Verbindung wird immer noch nicht abgebrochen ... – Softtouch

4

Vielmehr Disconnect() dann direkt anrufen und die Socket-Verbindung weg von TIdHTTP reißen, würde ich eine Ausnahme statt erhöhen, wie SysUtils.Abort() Aufruf und lassen TIdHTTP oder der aufrufende Thread die Buchse schließen nachdem die Anfrage vollständig abgebrochen wurde.

procedure TMyThread.OnWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: int64); 
begin 
    if Self.Abort then SysUtils.Abort; 
end; 

procedure TMyThread.Execute; 
var 
    HTTP: TIdHTTP; 
begin 
    HTTP := TIdHTTP.Create; 
    try 
    ... 
    finally 
    HTTP.Free; 
    end; 
end; 
+0

Funktioniert nur auf einem PC, aber wenn auf einem Mac läuft, schließt die App vollständig, und paserver zeigt Laufzeitfehler 231. Ich habe es versucht um es zu debuggen, aber nichts wird nach der Abbruchzeile mehr ausgeführt, und auch das idhttp.get kehrt in diesem Fall nicht zurück. – Softtouch

+0

Ab heute konnte ich keine Lösung finden, um indy beim Ausführen auf MAC OSX ordnungsgemäß abzubrechen. Dieses Problem macht Indy völlig nutzlos, da Benutzer keine Möglichkeit haben, eine Verbindung abzubrechen. – Softtouch

+0

@Softtouch dann müssen Sie Embarcadero für Unterstützung kontaktieren. Dies ist ein Delphi-Problem, kein Indy-Problem. Indy verlässt sich ziemlich stark auf Ausnahmen. Wenn die Ausnahmebehandlung unter OSX unterbrochen wird, muss Embarcadero das an ihrem Ende beheben. –