LINUX.ORG.RU

Сигналы-слоты. boost vs. qt

 , ,


1

4

Всем доброго дня.

Реквестирую истории успеха/неуспеха использования сигналов/слотов из состава boost. Интересует в первую очередь сравнение с кутишными сигналами/слотами.

И еще интересно, зачем в qt используют свой лисапед вместо бустового? Дело только в коннекте через очередь сообщений? А в бусте нет ничего подобного?

P.S. Может быть кто-то вкурсе, собираются ли включить этот механизм в один из следующих стандартов?

★★★★★
Ответ на: комментарий от bhfq

Это еще одна альтернатива?

Какие у нее есть преимущества по сравнению с двумя предыдущими кандидатами помимо того, что ее предложил человек с вождем на аватарке?

trex6 ★★★★★
() автор топика

qt используют свой лисапед

потому-что кутя появилась тогда, когда в спп ещё даже ексепшенов не было, не то что буста с его е-шаблонами.

nanoolinux ★★★★
()
Последнее исправление: nanoolinux (всего исправлений: 1)
Ответ на: комментарий от bhfq

Ок, тоже постараюсь глянуть.

Если интересно - могу потом свои мысли сюда скинуть.

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

Это понятно. Но ведь был переход на 5-ку, когда этот механизм пересматривался. Они от буста по каким-то причинам отказались?

trex6 ★★★★★
() автор топика

Расскажи лучше зачем вообще нужны сигналы без GUI?

Я им ни одного достойного применения не вижу, кроме GUI. А отсюда следует что boost.signals(2) ненужны!

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

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

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

зачем вообще нужны сигналы

man sigaction как бы. или даже man signalfd

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

Не знаю.

Я узнал о этой штуке, так как на ней Gtkmm делает typesafe сигналы без препроцессора

https://developer.gnome.org/libsigc -tutorial/stable/ch02.html#id447321

Ну и собственно поддержка member functions тоже итд

vertexua ★★★★★
()
Последнее исправление: vertexua (всего исправлений: 1)
Ответ на: комментарий от trex6

Но ведь был переход на 5-ку, когда этот механизм пересматривался. Они от буста по каким-то причинам отказались?

а по каким причинам они должны были его использовать? boost signals хуже реализации в Qt5

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

Отлично, теперь хотелось бы услышать аргументацию.

Я пока что заметил лишь отсутствие проброса сигналов через очередь сообщений в бусте. Qt использую последние 5 лет, про буст вдумчиво читать начал только сегодня.

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

Я пока что заметил лишь отсутствие проброса сигналов через очередь сообщений в бусте

Дык в бусте же нету реализации очереди сообщений (говнокласс из boost::asio не в счет).

Pavval ★★★★★
()

Зачем Кьюту бустовская реализация, если своя вполне удобная и работоспособная? Тем более, в 5 версии добавили коннекты на шаблонах.

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

Отлично, теперь хотелось бы услышать аргументацию.

сходу:

connect( act, &QAction::triggered, []( bool c ) {} ); // OK
connect( act, &QAction::triggered, []() {} ); // OK
act.signal_triggered.connect( []( bool c ) {} ); // OK
sig.signal_triggered.connect( []() {} ); // FAIL

ну и boost signals банально многословнее и требует руками выписывать параметры шаблонам

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

А скорость? Вроде ж оно в Qt медленнее.

в Qt скорость сигнал-слотов вполне достаточна для работы на всяких Symbian, так что ради скорости переходить на другие реализации им точно не было надобности

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

На сколько я помню, QueueConnection ставит в очередь сообщений, а DirectConnection заменяется на прямой вызов, так что, с ним оверхеда никакого.

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

Там есть небольшой оверхед на маршалинг аргументов в void*, пока вызов путешествует по кишочкам метаобъектной системы Qt.

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

Разве в пятерочке нету второго, более нового приплюснутого механизма сигналов-слотов?

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от wota

boost signals хуже реализации в Qt5

С хрена ли? У типобезопасных Qt-шных сигналов нет возможности явно задавать тип функции отправителя и приёмника, как минимум. А задаваемые строками — адЪ и Израиль, достаточно ошибиться в одном символе с любой стороны, и начинается гадание по звёздам, а шо это у меня не вызывается, или не генерируется, и где именно? А про boost-овые Signals2 есть хорошая статья с описанием их внутренностей, и как они работают.

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

У типобезопасных Qt-шных сигналов нет возможности явно задавать тип функции отправителя и приёмника, как минимум.

но зачем? если сигнатура слота не позволяет принимать аргументы из сигнала, то будет ошибка при компиляции, что еще надо?

А задаваемые строками — адЪ и Израиль, достаточно ошибиться в одном символе с любой стороны, и начинается гадание по звёздам, а шо это у меня не вызывается, или не генерируется, и где именно?

ЕМНИП, Qt в таких случаях в stderr выведет сообщение, что и куда не приконнектилось

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

А про boost-овые Signals2 есть хорошая статья с описанием их внутренностей, и как они работают.

  boost::signals2::signal<void (int)> sig;

  boost::shared_ptr<TrackedHelloWorld> p(new TrackedHelloWorld());
  boost::signals2::signal<void (int)>::slot_type s(*p);
  s.track(p);
  sig.connect(s);

да ну нах такое счастье, и это еще без очередей и многотредовости

wota ★★
()

В Qt сигнал - это всего лишь функция, которую пишет за тебя MOC, в boost сигнал - это функциональный объект, в связи с этим размер класса прилично растет с каждым новым сигналом. Но в остальном бустовый вариант мне нравится больше... хотя нет, я сделал свой велосипед на C++11, не имеющий фатальных недостатков первых двух вариантов ;-)

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

Для своих, рукодельных сигналов/слотов, нопремер.

в Qt5 можно связывать сигнал с произвольным методом или функцией, их можно считать «рукодельными»?

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

да ну нах такое счастье

typedef-ы запретили уже?

без очередей и многотредовости

В-третьих, в анализе упускаются места, связанные с многопоточностью. Многопоточность влияет только на правильную расстановку в нужных местах объектов блокировки. Данная задача решается в библиотеке так же, как и в любом другом коде.

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

в Qt5 можно связывать сигнал с произвольным методом или функцией

Если функция/метод перегружены? В boost::Signals2 это решается просто, а вот в Qt, где нет явного указания сигнатуры функций — я ХЗ, как это провернуть без заморочек.

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

typedef-ы запретили уже?

те же яйца

Многопоточность влияет только на правильную расстановку в нужных местах объектов блокировки. Данная задача решается в библиотеке так же, как и в любом другом коде

бла-бла-бла, а по факту - надо велосипедить там, где в Qt не надо

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

Любые асинхронные операции, да и общение между тредами лучше сделать через очередь сообщений, которая прозрачно достигается через сигналы/слоты.

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

те же яйца

В конце концов, есть уже вполне поддерживаемый конпеляторами C++11, который может в auto и прочие decltype.

надо велосипедить там, где в Qt не надо

Нытьё такое нытьё. Де ты велосипеды увидел-то?

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

а вот в Qt, где нет явного указания сигнатуры функци

А это что тогда?

QObject::connect(_process, static_cast<void (QProcess::*)(int)>(&QProcess::finished), [&](int) {});

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

нет проблем, только что проверил

Дома буду, тоже посмотрю, что там наделали. Так, глядишь, и на Qt 5 перейти сподоблюсь.

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

Бывали у меня такие веселухи, приходилось делать заклинания типа такого:

        connect(this, &Connection::commandSent,
                device, static_cast<void (AbstractDevice::*)(const Command &)>(&AbstractDevice::send), Qt::QueuedConnection);
Но это разве не явное задание типа функции слота?

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

В конце концов, есть уже вполне поддерживаемый конпеляторами C++11, который может в auto и прочие decltype

прекрасно, перепиши:

  boost::signals2::signal<void (int)> sig;

  boost::shared_ptr<TrackedHelloWorld> p(new TrackedHelloWorld());
  boost::signals2::signal<void (int)>::slot_type s(*p);

на С++11

Нытьё такое нытьё. Де ты велосипеды увидел-то?

покажи как ты сделаешь аналог Qt::QueuedConnection, да и код выше - тоже велосипед, который в Qt не нужен

wota ★★
()

Кстати, для общения между тредами, можно использовать лямбда функции, которые возращают другую лямбду. Тогда отдаем в другой тред эту лямбду: там ее запускаем, она исполняется, потом лямбду с результатом заталкиваем в исходный тред и там уже она уже выступает в роли колбэка.

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

перепиши... на С++11

Не сейчас, а то лениво. Да и не помню я навскидку, насколько Signals2 совместимы со стандартной библиотекой C++11.

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

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

В следующих стандартах плюсов обещаются много интересного для многопоточности и асинхронности впилить. Будем посмотреть, попробовать.

one_more_hokum ★★★
()

boost.Signals2 потокобезопасные а boost.Signals нет

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