Как я могу заставить свое приложение вести себя хорошо при мониторинге сотен устройств в реальном времени? - PullRequest
10 голосов
/ 03 мая 2011

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

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

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

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

Ответы [ 4 ]

3 голосов
/ 03 мая 2011

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

1 голос
/ 04 мая 2011

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

Асинхронный - неблокирующая, основанная на событиях связь (с использованием ICS , Умный и т. Д.) Будет намного проще реализовать.

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

1 голос
/ 04 мая 2011

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

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

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

1 голос
/ 04 мая 2011

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

...