Russian Qt Forum
Апрель 07, 2020, 19:44 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Решено] Обмен данными между независимыми   (Прочитано 1191 раз)
Inhibitor
Новичок

Offline Offline

Сообщений: 37


viva la evolucion


Просмотр профиля
« : Январь 28, 2020, 21:13 »

Товарищи архитекторы ПО, нужен ваш совет.

Есть два независмых приложения. Независмость приложений полная: то есть это разные программы, у которых нет общих ресурсов и которые могут быть запущены в разное время в произвольном порядке. Допустим программа №1 владеет владеет некой именованой сущностью к которой привязан уникальный ID, который необходим для программы №2 для формирования данных. Пусть программа 2 знает имя сущности (доустим это констанстная сущность), так вот можно ли каким-либо способом по имени сущности вытянуть ID?

Первое решение которое пришло в голову простое, но корявое. Программа 1 при запуске формирует файл в конкретной директории (путь до файла и имя файла это и есть та самая именованая сущность). В этот файл программа пишет уникальный ID. После завершения работы программа 1 удаляет файл. Программа 2 знает и путь и имя файла. После старта программа 2 проверяет наличие файла и в случае его существования вычитывает ID и начинает работу, в противном случае программа 2 ничего не делает.

Возможно ли нечто подобное сделать, но без привязке к файловой структуре?

Спасибо!
« Последнее редактирование: Март 31, 2020, 21:13 от Inhibitor » Записан
_Bers
Бывалый
*****
Offline Offline

Сообщений: 473


Просмотр профиля
« Ответ #1 : Январь 28, 2020, 21:18 »

Возможно ли нечто подобное сделать, но без привязке к файловой структуре?

реестр windows, например.

или shared memory
« Последнее редактирование: Январь 28, 2020, 21:23 от _Bers » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 10740


Просмотр профиля
« Ответ #2 : Январь 29, 2020, 08:27 »

..и которые могут быть запущены в разное время в произвольном порядке.
Это момент принципиальный.

Ситуация: "приложение 1" создает задание которое выполняется "приложением 2" напр завтра, или неделю спустя. Т.е. только задание важно, запущено "приложение 1" или как - не имеет значения. Тогда только файл(ы), без привязки не обойтись, но можно хранить путь в системе.

Если же предполагается что оба приложения запущены - возможностей больше. Лично я делаю через shared память и проблем не имею. Когда-то один знаток советовал "pipe" (трубы, что ли) но с чем их едят - так и не знаю
Записан
qate
Супер
******
Online Online

Сообщений: 1041


Просмотр профиля
« Ответ #3 : Январь 29, 2020, 09:19 »

Программа 1 при запуске формирует файл в конкретной директории ... После завершения работы программа 1 удаляет файл.

Если программа 1 удалила файл, то как программа 2 его откроет или я не понял смысла обмена ?
Записан
Inhibitor
Новичок

Offline Offline

Сообщений: 37


viva la evolucion


Просмотр профиля
« Ответ #4 : Январь 29, 2020, 18:28 »

Таки QSharedMemory  Смеющийся

Однако вот какой вопрос возник: программа 1 написана на Qt, программа 2 на чистом WinAPI. Вопрос на счет ключа. Программа 1 создает шару через конструктор
Код:
QSharedMemory(const QString &key, QObject *parent = nullptr)
где key это к примеру некий текст типа такого "SharedMemory Example". Если бы программа 2 была написана на Qt, то все было бы заебитлз.По данному ключу программа 2 видит шару.
Однако у нас WinAPI и он ищет шару через функцию
Код:
OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE,  szName)
где последний параметр это имя ключа. Однако если на его место поставить ключ "SharedMemory Example", то программа 2 шару не видит. Однако если в программе 1 дать команду
Код:
nativeKey()
то команда выдаст вот такую говнямбу:
Код:
qipc_sharedmemory_QSharedMemoryExampleff77196351dd7c1c8f79461ad32f21726fe31f5b
Если ее подставить в программу 2, то WinAPI находит шару. Причем ключ-говнямба на разных машинах имеет одно и то же значение, от чего я сделал вывод что генерируемый nativeKey зависит только исходного текста, который в нашем случае "SharedMemory Example".

Собственно вопрос (сам искал в сети и ничего путного пока не нашел): есть ли возможность в WinAPI обойтись без нативного ключа? Или может в WinAPI есть функция генерации ключа-говнямбы по заданому тексту?

Если программа 1 удалила файл, то как программа 2 его откроет или я не понял смысла обмена ?

Программа номер 2 может быть запущена в момент работы программы 1. Только тогда и произойдет вычитка ID, после чего программа 2 заработает в полную силу. В остальных случаях программа 2 лососнет тунца.
Записан
qate
Супер
******
Online Online

Сообщений: 1041


Просмотр профиля
« Ответ #5 : Январь 30, 2020, 09:24 »

Таки Udp/Tcp сокеты
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 10740


Просмотр профиля
« Ответ #6 : Январь 30, 2020, 11:49 »

Собственно вопрос (сам искал в сети и ничего путного пока не нашел): есть ли возможность в WinAPI обойтись без нативного ключа? Или может в WinAPI есть функция генерации ключа-говнямбы по заданому тексту?
1) Никто не мешает использовать нативное API и в приложении 1, ну будет чуть менее удобно.

2) Напечатать "полный" ключ в приложении 1 и вбить эту константу в приложение 2.

(Исходное) имя ключа лучше связать с именем приложения. Если оба приложения должны быть в одной папке, то лучше использовать полный путь как имя. Иначе (если создатель приложение 1 может находиться где угодно), не помешает вписать полный путь а сам блок. Когда получите блок, не забудьте его "залочить" перед чтением/записью. Синхронизация - через системный семафор.
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1017


Просмотр профиля
« Ответ #7 : Март 19, 2020, 15:32 »

Registry (+ File) если Windows.
Таким образом у вас все в одном месте будет сосредоточено.
Я так понял приложение 1 и 2 могут быть запущены в разное время и не пересекаться? Если так, то пишем/читаем в реестр по заранее оговоренным ключам и это нормальная практика.
Можно писать так же в файл, если объемы большие.
shared memory - ну такое, отъедать память, тут надо подумать насколько интенсивен обмен + перезагрузка и все, данные потеряны
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.092 секунд. Запросов: 22.