Delphi хорошая схема для интенсивного использования ввода / вывода - PullRequest
0 голосов
/ 05 мая 2018

У меня есть программа, которая использует 5 последовательных портов для получения данных от оборудования и сохранения их в базе данных MySQL, а также для передачи их в третье место с помощью tcp / ip

для последовательных портов, я использую Async, поэтому у них есть отдельные потоки. Так что я не могу сделать системный интерфейс медленным. Но если я использую соединение MySQL в потоках, созданных компонентом последовательного порта, это тратит время на чтение из буфера и переполнение буфера. ошибка загрузки

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

Как лучше всего обрабатывать приложения такого типа?

1 Ответ

0 голосов
/ 18 мая 2018

Проблема, которую вы описали, разрешима путем установки очереди FIFO между COM-портами и потоками MySQL. Существует некоторый поток данных (назовите его в восходящем направлении) от COM-устройств, поместите эти данные в Поточно-безопасный FIFO (Delphi имеет одну реализацию: System.Generics.Collections.TThreadedQueue) и выделите N потоков для MySQL, которые будут считывать часть данных из очереди FIFO (назовите это вниз по течению). Таким образом, вы преобразуете свою задачу в классическую задачу производителя / потребителя. Если потоки MySQL слишком медленные, размер FIFO будет увеличиваться, в этом случае вам придется увеличить количество потоков MySQL. Вы можете определить оптимальное количество потоков MySQL, просмотрев средний размер FIFO.

Проблема перегрузки буфера драйвера возникает в том случае, когда физическое устройство записывает данные быстрее, чем ваша программа может их обработать. В вашем случае это происходит из-за медленной части потока MySQL.

По правде говоря, скорость COM-порта очень медленная по сравнению с процессором и потоками, я уверен, что суть вашей проблемы - вы считываете с COM-устройств большое количество кусочков данных небольшого размера и переносите каждый маленький кусочек данных в операцию SQL в фоновом режиме вашей библиотеки MySQL. Перенесите свой взгляд на BATCHING - объедините большое количество данных малого размера с более большими пакетами данных, чтобы вы могли уменьшить количество операций SQL по TCP / IP

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