LINUX.ORG.RU

1 гуй, 2 программы

 , ,


0

3

Мне необходимо одной gui оберткой общаться с двумя программами, им будут отсылаться запросы «сделай» и «сделай и верни результат». Во втором варианте сделанная работа может быть настолько мелкой, что результат должен быть получен молниеностно.. Возможно ли реализовать это через dbus? Насколько оно будет производительно? Есть более легкие аналоги? Или разумнее будет свой велосипед создать? Яп - rust.



Последнее исправление: vuyagohac (всего исправлений: 1)

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

синхронный вызов прямо из GUI? Тебе нельзя программировать.

Deleted
()
Ответ на: комментарий от Deleted

В общем, есть 2 программы, есть 2 gui обертки. При нажатии кнопки в обертке1 отсылается команда «завари чай» программе2. Программа2 выполняет и результат помещает в некоторое хранилище, в котором обертка1 и обертка2 могут узнать состояние выполнения команды «завари чай» и результат ее выполнения. Но обертка1 и обертка2 могут не просто узнать состояние, но и вопользоваться результатом выполнения команды при необходимости (например, показать лейбл - «чай заварен»). Мне кажется, что под эту задачу подходит dbus, но насколько будет производительным данная реализация? Сейчас подробнее разберусь с пайпами, про которые упомянули в 1-ом коменте. Есть ли еще возможные решения?

vuyagohac
() автор топика
Ответ на: комментарий от anonymous

два чая сему товарищу. программа - сервер, гуй клиент.

anonymous
()

Просто добавь воды третью программу которая будет раздавать/принимать задачи через popen() из/в две других программы, а гуй будет просто выводить что там ему выдал этот импровизированный «сервер». А «сервер» для общения с гуем пусть использует сокеты, причём два один для отдачи команд, другой для получения результатов.

Dron ★★★★★
()
Ответ на: комментарий от Dron

После прочтения этой статьи был просто поражен предоставляемыми возможностями. Стоит ли пойти по пути кде и гнома использовать зарекоменованную технологию или лучше свое городить?

vuyagohac
() автор топика

Возможно ли реализовать это через dbus?

Qt, например, умеет такое из коробки:

http://doc.qt.io/qt-5/qtdbus-index.html

Яп - rust.

Е%сь с этой х%йней сам, сын мой. (с)

anonymous
()
Ответ на: комментарий от Harald

Плюсую, тоже не понял в чем проблема просто заюзать пайпы.

loz ★★★★★
()
Ответ на: комментарий от vuyagohac

Ну дбас быстр можно конечно и его.

Dron ★★★★★
()

Гуй тоже на расте пишешь?

DarkEld3r ★★★★★
()

Через dbus ничего никогда не нужно реализовывать. Делай через обычный pipe как сказали.

slovazap ★★★★★
()

Все на десктопе делается через dbus. Насколько часто будут делаться такие запросы? Если часто, то почему не отправлять сразу много запросов в одном DBus вызове?

vertexua ★★★★★
()
Ответ на: комментарий от next_time

ну а если пропускной способности пайпов недостаточно, тогда используют shared memory

Harald ★★★★★
()
Ответ на: комментарий от next_time

На столько, что ты в оперции с ними не упрешся. Упрешься, скорее всего, в анализ того, что поступает через них, чем в IO операции с ними.

anonymous
()

а вообще ТС, ты не написал, что эти две программы делают, как общаются с внешним миром

Про возможные варианты взаимодействия программ между собой и когда что следует выбирать можно почитать в The Art of Unix Programming

Harald ★★★★★
()
Ответ на: комментарий от Harald

Пример: нужно получить список файлов в директории и выдать обертке результат, чекбоксом управлять состоянием программы - задачи тривиальные, необходимо лишь отсутствие видимых задержек (получения/отправки) работы графической обертки. Всё это внутри одной ОС, но если dbus предоставляет возможности работы гуя по сети - лишним точно не будет.

vuyagohac
() автор топика
Ответ на: комментарий от Dron

только он будет для моего компа объективен. но можно попробовать.

next_time ★★★★★
()
Ответ на: комментарий от vuyagohac

если файлов много, то получение списка может происходить с ощутимой задержкой, так что или select/poll или в отдельном от гуя потоке

Harald ★★★★★
()
Ответ на: комментарий от vuyagohac

вообще это как бы достаточно простые задачи, можно перечислять файлы и создавать файлы внутри программы системными вызовами, возможно даже проще, чем запускать ls и mkdir, в общем тут юниксвейность не особо нужна

Harald ★★★★★
()
Ответ на: комментарий от Harald

Необходимо полностью отцепить от гуев сердце программы так, чтобы с ним могла работать любая обертка и, собственно говоря, любая другая программа. Меня заинтересовала идея dbus, да к тому же он еще и из коробки стоит в любой линуксовой системе. Конечно, dbus как прослойка вносит задержки, но насколько большие? Вся его суть в основном сводится к доставке результата по адресу, пайпы полагаю делают то же самое..

vuyagohac
() автор топика
Ответ на: комментарий от slovazap

Это у тебя не нашлось. Не осилил dbus - не учи гадостям окружающих

vertexua ★★★★★
()

Попробуйте D-Bus. Если объёмы передаваемых данных не слишком большие, и частота не слишком высокая, D-Bus подойдёт.

Стоит сперва попробовать D-Bus, если что-то будет тормозить - переписать эту часть с использованием более низкоуровневых средств IPC.

Evil_And ★★
()
Ответ на: комментарий от vuyagohac

Такую задачу D-Bus точно потянет. Вот содержимое файлов передавать по D-Bus уже вряд ли целесообразно. Хотя, на быстрых машинах тормозов можно и не заметить.

Думаю, если действие разовое - пользователь нажал кнопку, в формочке через некоторое время отобразился результат, - можно и большие сообщения гонять по шине.

Evil_And ★★
()
Ответ на: комментарий от vuyagohac

1. Как вам удобнее.

2. Согласно спецификации:

The maximum length of a message, including header, header alignment padding, and body is 2 to the 27th power or 134217728 (128 MiB). Implementations must not send or accept messages exceeding this size.

http://dbus.freedesktop.org/doc/dbus-specification.html#message-bus-messages

Evil_And ★★
()
Ответ на: комментарий от vuyagohac

Точно ответить не могу, нужно проверить.

Но сначала выяснить, нужна ли такая микрооптимизация в данном проекте?

Evil_And ★★
()
Ответ на: комментарий от Evil_And

Ладно, можно попробовать вынести весь функционал в библиотеки..

  1. Я правильно понимаю, что при старте программы1 стартует его динамически слинкованная библиотека. Пока программа1 запущена, в памяти висит его зависимость. Запускаем программу2, ей тоже нужна эта библиотека и она пользуется той, что уже в памяти?
  2. Велика ли разница в производительности будет: вызывать методы из библиотеки VS вызывать методы через dbus? А если из kdbus? Каков будет оверхед?
vuyagohac
() автор топика
Ответ на: комментарий от vuyagohac

1. В Linux - да, именно поэтому динамические библиотеки ещё и называют разделяемыми.

2. Через библиотеку быстрее конечно, чем через IPC. IPC нужны для обмена данными между разными процессами. Overhead будет из за копирования данных в ядро и обратно, а также из за сериализации/десериализации данных. При вызове метода данные передаются из программы-клиента демону D-Bus, затем от демона D-Bus программе-сервису, обратно они тоже передаются через демон.

С переходом на kdbus overhead частично исчезнет. Предварительные тесты показывают интересные результаты: http://ru.fedoracommunity.org/content/Первые-бенчмарки-kdbus

Evil_And ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.