можете ли да прекъснете разговор с Indy Connect?

Имам връзка, на която давам 20 секунди за изчакване (бавна връзка). Трябва да позволя на моя потребител да отмени това свързващо повикване.

Вече имам свързване в нишка, така че мога да поддържам GUI, но как да кажа на Indy да отмени? Също така трябва да извикам cancel от основната нишка, защото повикването за свързване е блокирано. Възможно ли е това?

Това е за C++ Builder, но отговорът на Delphi ще се справи добре.


person Gregor Brandt    schedule 22.11.2010    source източник


Отговори (2)


Единственият начин да прекъснете Connect() е да извикате Disconnect() от контекст на нишка, различен от този, който извиква Connect(). В тази ситуация вашата основна нишка може директно да извика Disconnect() и след това вашата нишка може да обработи изключението, което Connect() предизвиква в отговор.

person Remy Lebeau    schedule 22.11.2010

Може би друг начин е да създадете свой собствен наследник на TIdAntiFreeze и в неговия метод Process() да хвърлите грешка, ако клиентът иска да излезе, което ще прекъсне опита за свързване и след това можете да прихванете тази конкретна грешка и да отговорите съответно.

След като създадете компонент TIdAntiFreeze, рутинните процедури за свързване трябва да го намерят. Можете да го настроите малко със свойството IdleTimeout, което е колко често се извиква методът DoProcess().

Алтернативно, създайте свой собствен IOHandler, който използва TIdConnectThread като този код на AntiFreeze и се справя с грешката по-елегантно.

person Darian Miller    schedule 23.11.2010
comment
Извличането на персонализиран компонент TIdAntiFreeze няма да работи, ако Connect() се извика в контекста на работна нишка. Indy специално игнорира TIdAntiFreeze обекти, когато I/O операции се изпълняват извън контекста на основната нишка. Това е така, защото методът TIdAntiFreezeBase.ShouldUse() се извиква преди да се извика Process(), а ShouldUse() проверява ID на извикващата нишка и не може да бъде заменен, тъй като не е виртуален. - person Remy Lebeau; 03.01.2011