Nano Hash - криптовалюты, майнинг, программирование

Indy генерирует несколько исключений при закрытии сокета. Как сделать чистое автоматическое переподключение?

У меня есть приложение Delphi 6, которое использует компоненты Indy 9 для поддержания постоянного IdTCPConnection с внешним устройством. Иногда я хочу разорвать соединение, а затем снова подключиться к устройству. Я обнаружил, что когда я это делаю, Indy выдает до 3 отдельных исключений. Это сделало разработку чистой стратегии повторного подключения несколько запутанной, поскольку компонент Indy находится в фоновом потоке, и я не хочу прерывать цикл выполнения потока () .

Каков хороший или чистый способ поглотить 3 исключения, прежде чем я попытаюсь снова подключиться? Я видел 3 исключения: EIdClosedSocket, EIdConnClosedGracefully, EIdSocketError (с LastError = WSAECONNABORTED). Я хочу дождаться распространения всех исключений, связанных с закрытием сокета, прежде чем пытаться повторно подключиться, но я не уверен, как структурировать цикл кода для этого.


Ответы:


1

Только одно исключение будет достигать кода вашего потока за раз. Просто оберните код внутри цикла потока с помощью блока try/except, а затем повторно подключитесь к следующей итерации цикла.

while not Terminated do
begin
  if not Client.Connected then
  try
    Client.Connect;
  except
    Sleep(2500);
    Continue;
  end;
  try
    // communicate with device as needed...
  except
    on E: EIdException do
    begin
      // Indy socket error, reconnect
      Client.Disconnect;
      Client.InputBuffer.Clear;
    end;
    on E: Exception do
    begin
      // something else happened in your code...
    end;
  end;
end;
14.06.2012
  • но тогда дополнительные исключения заставят блок Except снова сработать, когда вместо этого я хочу, чтобы вновь подключенное соединение оставалось жизнеспособным. Это правильно? Не будет ли это проблемой? Кстати, если у вас есть возможность, я хотел бы узнать ваше мнение о другом сообщении, которое я открыл в Stack Overflow, относительно обновления списка кодеков, представленного AviSaveOptions(): stackoverflow. ком/вопросы/11013713/ 14.06.2012
  • Нет, то, что вы описываете, не соответствует действительности. Как я уже сказал, только одно исключение достигнет вашего кода. Это может быть EIdClosedSocket ИЛИ EIdConnClosedGracefully ИЛИ EIdSocketError, но не все три сразу. И сам Disconnect() вообще не должен вызывать никаких исключений, но если это так, попробуйте вместо этого использовать DisconnectSocket(). 14.06.2012
  • Хорошо спасибо. По какой-то причине у меня сложилось впечатление, что я попал в более чем одно исключение, но это могло быть связано с тем, что я устанавливал точки останова и видел исключения из более чем одного экземпляра компонента и неверно истолковывал их как все для одного и того же экземпляра . 14.06.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..