2010-11-22 12 views
3

Ich habe eine Verbindung, die ich 20 Sekunden für ein Timeout geben (langsame Verbindung). Ich muss meinem Benutzer erlauben, diesen Verbindungsanruf abzubrechen.können Sie einen Indy-Connect-Anruf unterbrechen?

Ich habe bereits die Verbindung in einem Thread auftreten, so dass ich die GUI halten kann, aber wie sage ich Indy, um abzubrechen? Ich muss auch vom Hauptthread abbrechen, weil der Verbindungsanruf blockiert ist. Ist das möglich?

Dies ist für C++ Builder, aber eine Delphi-Antwort wird gut funktionieren.

Antwort

8

Die einzige Möglichkeit zum Abbrechen von Connect() besteht darin, Disconnect() von einem anderen Threadkontext als dem aufzurufen, der Connect() aufruft. In dieser Situation kann Ihr Haupt-Thread Disconnect() direkt aufrufen, und dann kann Ihr Thread die Ausnahme behandeln, die Connect() als Antwort auslöst.

+0

funktioniert einwandfrei –

0

Vielleicht ist eine andere Möglichkeit, Ihren eigenen TIdAntiFreeze-Nachkommen zu erstellen, und in seiner Process() - Methode einen Fehler auszulösen, wenn der Client den Verbindungsversuch abbrechen möchte, und Sie dann für diesen bestimmten Fehler abfangen und entsprechend reagieren können.

Sobald Sie eine TIdAntiFreeze-Komponente erstellen, sollten die Verbindungsroutinen sie finden. Sie können es mit der IdleTimeout-Eigenschaft ein wenig anpassen, wie oft die DoProcess() -Methode aufgerufen wird.

Alternativ können Sie einen eigenen IOHandler erstellen, der einen TIdConnectThread wie diesen AntiFreeze-Code verwendet und den Fehler eleganter behandelt.

+1

Das Ableiten einer benutzerdefinierten TIdAntiFreeze-Komponente funktioniert nicht, wenn Connect() im Kontext eines Worker-Threads aufgerufen wird. Indy ignoriert explizit TIdAntiFreeze-Objekte, wenn I/O-Vorgänge außerhalb des Kontexts des Hauptthreads ausgeführt werden. Dies liegt daran, dass die TIdAntiFreezeBase.ShouldUse() -Methode aufgerufen wird, bevor Process() aufgerufen wird, und ShouldUse() die ID des aufrufenden Threads überprüft und nicht überschrieben werden kann, da sie nicht virtuell ist. –

Verwandte Themen