2010-11-22 27 views
3

我有一個連接,我給20秒超時(慢速鏈接)。我需要允許我的用戶取消此連接呼叫。你可以中斷Indy連接呼叫嗎?

我已經有一個線程發生連接,以便我可以保持圖形用戶界面,但我該如何告訴Indy取消?我也必須從主線程調用取消,因爲連接呼叫被阻止。這可能嗎?

這是用於C++ Builder,但是Delphi的答案可以做得很好。

回答

8

中止Connect()的唯一方法是從與調用Connect()不同的線程上下文中調用Disconnect()。在這種情況下,您的主線程可以直接調用Disconnect(),然後您的線程可以處理Connect()引發的異常。

+0

完美作品 – 2010-12-10 12:55:39

0

也許另一種方法是創建您自己的TIdAntiFreeze後代,如果客戶端想要退出將拋出連接嘗試,然後您可以捕獲此特定錯誤並作出相應響應,則在其Process()方法中拋出錯誤。

創建TIdAntiFreeze組件後,連接例程應該找到它。您可以使用IdleTimeout屬性稍微調整它,即DoProcess()方法被調用的頻率。

或者,創建一個您自己的IOHandler,它使用像這樣的AntiFreeze代碼執行的TIdConnectThread,並更優雅地處理錯誤。

+1

如果在工作線程的上下文中調用Connect(),則派生自定義TIdAntiFreeze組件將不起作用。當I/O操作在主線程的上下文之外執行時,Indy會特別忽略TIdAntiFreeze對象。這是因爲在調用Process()之前調用TIdAntiFreezeBase.ShouldUse()方法,並且ShouldUse()檢查調用線程的ID,並且它不能被重寫,因爲它不是虛擬的。 – 2011-01-03 07:33:31

相關問題