Обмен данными между приложением *.exe и другой программой

Простейшие вопросы в области инженерной разработки
Ответить
Юрий
leader
leader
Сообщения: 526
Зарегистрирован: 28 фев 2010, 18:04
Версия LabVIEW: LV2018
Благодарил (а): 10 раз
Поблагодарили: 18 раз
Контактная информация:

Обмен данными между приложением *.exe и другой программой

Сообщение Юрий »

Приложение принимает данные по COM порту с разных устройств, заранее не известных. То есть структура данных становиться известна только по мере появления устройств. А хотелось бы иметь представление о данных в виде таблицы или графика. Один из вариантов рассматриваю такой. Приложение одно, которое имеет возможность отдавать из себя полученную информацию. А для каждого нового устройства писать свою программку, которая выделяла бы нужные данные и выводила их, или, в строго заданном формате, отдавала обратно приложению. Вижу, что обмен данными можно обеспечить через файлы. Если это единственный вариант, то интересно какую максимальную частоту такая система может пропустить через себя? Может, есть варианты без использования файлов?
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Обмен данными между приложением *.exe и другой программо

Сообщение dadreamer »

Обойду пока стороной вопросы архитектуры, наверняка кто-нибудь выскажется на этот счёт и предложит что-то оптимальное (плагины и т.д.). Коммуникацию между экзешниками можно реализовать множеством разных способов: TCP/IP, UDP, Network Streams, Shared Variables, CVT, Pipes, Shared Memory. Что-то попроще (Network Streams, Shared Variables), что-то посложнее (TCP/IP, UDP). Pipes и Shared Memory - функционал Windows, обеспечивает наименьшую латентность из всех способов. Но нужно немного понимать, как это работает. Про Pipes было несколько тем, где я описывал эту технологию и как её встроить в :labview: . К сожалению, из-за глюков форума часть сообщений (все, где были ссылки) пропала и кэши гугла/яндекса и вебархив не помогают. ( Например, одна из них: http://labviewportal.org/viewtopic.php? ... ilit=pipes Файлы для этой задачи я бы использовал не стал, ни к чему при каждой транзакции дёргать диск. Да и с файлами возможны разные "весёлые" ситуации: https://en.wikipedia.org/wiki/Race_cond ... le_systems Вот здесь кратко расписаны плюсы и минусы каждого подхода IPC (Inter-Process Communication): https://forums.ni.com/t5/Developer-Cent ... anguage=en Однако всё-таки первым делом надо железно определиться с архитектурой приложения или приложений. Потому что если реализовать всё в рамках одного проекта :labview: (например, на плагинах), то и возня с IPC не имеет смысла. Нужно определиться, как программа по работе с устройствами будет передавать данные в прочие программы: или это будет множество каналов "точка-точка" или это будет канал "один-многим", то же самое в обратную сторону. Все подобные вещи желательно продумать.
Юрий
leader
leader
Сообщения: 526
Зарегистрирован: 28 фев 2010, 18:04
Версия LabVIEW: LV2018
Благодарил (а): 10 раз
Поблагодарили: 18 раз
Контактная информация:

Re: Обмен данными между приложением *.exe и другой программо

Сообщение Юрий »

dadreamer, спасибо. С архитектурой сразу было понятно, что будут вопросы и предложения, но это не главное. Главное я услышал о других вариантах обмена данными с приложением, практически с ними не работал. Действительно, когда то по вашим ссылкам просматривал вариант с Pipes, но это было совсем давно. По поводу прочих программ хоть и их и будет какое то количество, но все они одновременно работать не будут - будет всего одна, что, конечно, облегчает работу. Структура такая: устройство (разные) - приложение (одно) - прочая программа (конкретно под текущее устройство). Ну что ж, буду анализировать предложенные варианты.
Аватара пользователя
toshas
assistant
assistant
Сообщения: 105
Зарегистрирован: 05 апр 2009, 22:45
Версия LabVIEW: 9.0
Благодарил (а): 13 раз
Поблагодарили: 7 раз
Контактная информация:

Re: Обмен данными между приложением *.exe и другой программо

Сообщение toshas »

Сделайте передачу на базе сетевых протоколов (UDP или TCP), нативная поддержка, простота реализации, возможность перейти потом на распределенную архитектуру.
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Обмен данными между приложением *.exe и другой программо

Сообщение dadreamer »

>> Структура такая: устройство (разные) - приложение (одно) - прочая программа (конкретно под текущее устройство).

При такой структуре можно выбрать любой способ коммуникации. Я бы взял Network Streams и не парился. Сколько с ним не работал, никогда проблем не было, как по сетке, так и на локалке. Имеющихся в LV примеров за глаза хватает, чтобы построить базовые алгоритмы приёма-передачи. Вот статья о том, как это работает и как выглядит: https://www.ni.com/ru-ru/innovations/wh ... chite.html Есть, конечно, и минусы, но в конкретном случае они не ощутимы.
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Для чайников»