Вы можете прервать соединение Indy? - PullRequest
3 голосов
/ 23 ноября 2010

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

У меня уже есть подключение, установленное в потоке, чтобы я мог поддерживать работу графического интерфейса, но как я могу сказать Indy отменить?Я также должен вызвать отмену из основного потока, потому что вызов подключения заблокирован.Это возможно?

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

Ответы [ 2 ]

8 голосов
/ 23 ноября 2010

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

0 голосов
/ 23 ноября 2010

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

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

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

...