У меня есть приложение A, и я хочу поделиться некоторой информацией с приложением B.
Приложение A записывает информацию каждые ~ 150 мс.
Приложение B читает информацию в любое время.
Я искал и нашел QSharedMemory
Это выглядит великолепно, но приложение B не будет разрабатываться моей компанией, поэтому я не могу выбрать язык программирования.
Является QSharedMemory
хорошая идея ?
Как я могу это сделать ?
QSharedMemory
является тонкой оболочкой для именованной и неназванной общей памяти платформы. Когда указано имя, существует просто файл, который другое приложение может отобразить в памяти и использовать из любого языка программирования, если указанный язык поддерживает двоичные буферы.
Интересно, не будет ли проще, если бы вы использовали канал для IPC. QLocalSocket
инкапсулирует это на конце Qt, а другая сторона просто использует собственный канал.
Совместно используемая память имеет смысл только в определенных сценариях, таких как, например, передача изображений, которые могут не сильно менять между приложениями, где стоимость постоянной загрузки всего изображения будет непомерно высокой в свете небольшой средней пропускной способности изменения. Изображение не должно означать визуальное изображение, это может быть изображение производственного процесса и т. Д.
Во многих случаях разделяемая память является преждевременной псевдооптимизацией, которая делает вещи намного сложнее, чем необходимо, и может, в случае множества взаимодействующих процессов, стать пессимизацией — вы платите стоимость в виртуальной памяти для каждого сегмента разделяемой памяти.
Похоже, вам нужно реализовать простой сервер, используя локальные сокеты, он должен быть довольно быстрым с точки зрения пропускной способности и простым в разработке. Сервер будет действовать для хранения данных из A и доставки их в B по запросу.
Очевидно, что он не будет работать «без приложения» между ними. Независимо от того, идете ли вы к общей памяти или к локальному сокету, вам понадобится некоторый серверный код для постоянного запуска для обслуживания A и B. Если A работает все время, он вполне может быть частью этого, но он также может быть автономный.
Было бы предпочтительнее использовать локальный сокет, потому что API для этого является более переносимым между различными языками программирования, в этом случае A и B могут быть реализованы на произвольных языках и платформах и взаимодействовать на уровне протокола сокета. С QSharedMemory
это не будет так переносимо в вашем сценарии.