В данной статье мы рассмотрим проблему, с которой сталкиваются разработчики в Delphi XE8, связанную с обработкой исключения ETetheringException при запуске приложения. Это исключение возникает в случае, когда менеджер тредов троттлинга резервирует 20 портов в диапазоне от 2020 до 2039 для запуска своих потоков коммуникации. Проблема заключается в том, что при попытке запустить 21-ый экземпляр приложения на одном компьютере, приложение становится неоткликающимся до тех пор, пока его не завершат принудительно. В статье будет дан пересказ информации из контекста, а также рассмотрены возможные решения, включая подтвержденный ответ от сообщества.
Описание проблемы
При разработке приложений на Delphi, особенно при использовании компонентов для троттлинга, важно понимать, как работает механизм резервирования портов. В случае использования TTetheringManager и TTetheringProfile, при запуске 20 экземпляров приложения на одном компьютере, 21-ый экземпляр может вызвать исключение ETetheringException. Это происходит из-за того, что менеджер троттлинга пытается использовать порты, которые уже заняты другими экземплярами приложения.
Исключение ETetheringException
Исключение ETetheringException может быть создано в методе Execute класса TTetheringNetworkManagerCommunicationThread из модуля System.Tether.NetworkAdapter. Это происходит, когда серверы TCP или UDP коммуникации не могут быть запущены. В отладчике исключение отображается корректно, но при продолжении выполнения программы приложение застревает в функции AcquireExceptionObject из модуля System и больше не возвращается.
Попытки решения
Разработчик пытался перехватить исключение с помощью конструкции try...except, но это не помогло. Он также использовал обработчик события OnException приложения, но он также не был выполнен.
Альтернативный ответ
В комментариях было предложено использовать ограничение на создание 20-ти экземпляров приложения, что является временным решением до устранения баги. Также было отмечено, что исключение происходит в отдельном треде, и его не удается перехватить в главном потоке.
Подтвержденный ответ
Разработчик обнаружил, что проблема действительно является багом в реализации троттлинга, и создал отчет о качестве для его фиксации (ссылка на отчет: https://quality.embarcadero.com/browse/RSP-11345). Это подтверждает, что проблема не в коде разработчика, а в самом компоненте.
Пример кода
Для демонстрации проблемы, вот пример кода, который может быть использован в обработчике события FormShow:
Однако, как было отмечено в сообщениях, блок except и finally не достигаются, и приложение застревает.
Заключение
Проблема с ETetheringException в Delphi XE8 связана с ограничением количества портов для тредов троттлинга. Разработчикам стоит быть внимательными при работе с такими компонентами и, при необходимости, использовать альтернативные подходы или обходить проблему, пока она не будет исправлена. Следите за обновлениями от Embarcadero, чтобы быть в курсе последних решений и исправлений.
Разработчики в Delphi XE8 сталкиваются с ошибкой ETetheringException, связанной с ограничением портов для тредов троттлинга, и ищут способы её понимания и решения.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS