вы можете прервать вызов Indy connect?


У меня есть соединение, которому я даю 20 секунд на тайм-аут (Медленное соединение). Мне нужно разрешить моему пользователю отменить этот вызов подключения.

У меня уже есть соединение, происходящее в потоке, так что я могу поддерживать работу GUI, но как я могу сказать Indy отменить? Я также должен вызвать cancel из основного потока, потому что вызов connect заблокирован. Возможно ли это?

Это для C++ Builder, но ответ на Delphi подойдет просто отлично.

2 3

2 ответа:

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

Возможно, другой способ-создать свой собственный потомок TIdAntiFreeze, и в его методе Process() выбросить ошибку, если клиент хочет выйти, которая прервала бы попытку соединения, а затем вы можете поймать эту конкретную ошибку и ответить соответственно.

Как только вы создадите компонент TIdAntiFreeze, подпрограммы соединения должны найти его. Вы можете немного настроить его с помощью свойства IdleTimeout, которое определяет, как часто вызывается метод DoProcess ().

Попеременно, создайте свой собственный IOHandler, который использует TIdConnectThread, как этот код AntiFreeze, и обработайте ошибку более изящно.