Как я могу заставить приложение хорошо себя вести, отслеживая сотни устройств в режиме реального времени?

Мне нужно разработать в режиме реального времени (т.е. запрашивать и получать информацию по меньшей мере один раз в секунду) в Delphi, который контролирует несколько удаленных устройств (может быть сотни). Связь осуществляется через TCP/IP.

Я ищу совет для разработки этого приложения, избегая 100% потребления процессора и минимизируя объем используемой ОЗУ. Другими словами, я хочу, чтобы мое приложение оставалось отзывчивым, а не блокировало систему или потребляло все ресурсы.

Моя основная проблема заключается в использовании потоков для мониторинга каждого удаленного устройства. Есть ли ограничение на количество потоков, которые может создать мое приложение? Можно ли запустить потоки с низким или средним приоритетом, чтобы минимизировать потребление ЦП?

Также рекомендуется приветствовать оптимальное использование памяти.

Ответ 1

Ваш инстинкт прав, вы хотите обработать запись в потоках вне основного потока. Создайте простой сервер tcp/ip, который создает новый поток для входящего соединения и обрабатывает его. Очевидно, что вам захочется делать такие вещи, как отслеживать каждый поток, чтобы завершить его, когда ваше серверное приложение закрывается, и, возможно, реализовать пул потоков/очередь, если вы хотите повторно использовать их, а не постоянно создавать и уничтожать их. Но то, что вы описываете, на самом деле является довольно простым серверным приложением в концепции. Там нет жесткого и быстрого ограничения на количество тем, которые вы можете создать. Но если соединения не являются постоянными и остаются открытыми, вы можете быть удивлены тем, как немногие фактически создаются одновременно.

Ответ 2

Удачи вам в этом. Я потратил пару лет на разработку общей платформы, чтобы сделать именно это. Если вы хотите, вы можете посмотреть на него здесь. По крайней мере вам нужно будет использовать некоторые комм-компоненты, которые уже работают очень надежно, например RemObjects.

Ответ 3

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

Вы можете проверить эту статью о ограничениях процесса и потока в Windows. Потоки могут иметь более низкий приоритет, но будьте осторожны, тогда их можно упреждать потоками с более высоким приоритетом и неспособными вовремя читать/записывать данные. Также слишком много потоков могут просто "отбросить" время, если им нечего делать, но планировщик вынужден дать им кусочек времени (поток должен быть очень хорошим, чтобы не использовать его, чтобы ничего не делать). Сколько потоков можно запускать одновременно без проблем, строго зависит от доступного оборудования.

Многое зависит от того, как данные доставляются (тянуть или нажимать? имеют ли все данные равные приоритеты или нет?) и усилие процесса после считывания данных и как быстро система должна реагировать на новые данные. Например, одно решение может включать в себя чтение данных и их очередность для обработки, но это не сработает, если время ответа должно быть короче, чем может позволить очередь.

Ответ 4

Я бы спросил, действительно ли вам нужны потоки. Лучший код - это код, который вам не нужно писать.

Async - неблокирование, связь на основе событий (с использованием ICS, Clever и т.д.) было бы намного проще реализовать.

То, что вы описываете, является клиентским приложением, для серверов обычно требуются потоки. Также "один раз в секунду" не так часто встречается даже сотнями подключений.