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

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

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

Это для С++ 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, когда операции ввода-вывода выполняются вне контекста основного потока. Это связано с тем, что метод TIdAntiFreezeBase.ShouldUse() вызывается до вызова Process(), и ShouldUse() проверяет идентификатор вызывающего потока, и его нельзя переопределить, поскольку он не является виртуальным. - person Remy Lebeau; 03.01.2011