Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > сигналы возвращающие значение


Автор: sergey_85 4.2.2010, 14:17
Привет!

Возник вопрос, всегда делал сигналы, возвращающие void, а можно ли создавать сигналы, которые возвр. значение?

Код

class MyClass: public QObject
{
 Q_OBJECT

...

signals:
    bool SendMsg(); //
};

//где-то в коде этого класса
...
bool isOk = emit SendMsg(); //так можно?

...


Спасибо!

Автор: andrew_121 4.2.2010, 14:29
нельзя. где-то в документации по сигнал-слотовой модели это описано.
для этого есть boost.signals

Автор: sergey_85 4.2.2010, 14:31
ок

Добавлено через 6 минут и 47 секунд
хорошо, а если возвратить из параметра ф-ции ссылку, думаете пройдет?

Код

class MyClass: public QObject
{
 Q_OBJECT

...

signals:
    void SendMsg(bool &isOk); //
};

//где-то в коде этого класса
...
 bool isOk;
 emit SendMsg(isOk); //так можно?
 if(isOk)
 {
   //
 }


...

Автор: KADABRA 4.2.2010, 19:29
Цитата(sergey_85 @  4.2.2010,  14:31 Найти цитируемый пост)

хорошо, а если возвратить из параметра ф-ции ссылку, думаете пройдет?

Да.

Автор: SABROG 4.2.2010, 20:37
Не должно пройти. Чтобы прошло тип еще надо зарегистрировать. А такое вообще бессмысленно:

Код

 bool isOk;
 emit SendMsg(isOk); //так можно?
 if(isOk)
 {
   //
 }


Если сигнал межпоточный или Qt::QueuedConnection, то сразу после emit в isOK результата не будет. Для подобных сигналов всего-лишь добавляется в очередь событий эвент QEvent::MetaCall. А обрабатывается он только после того как ты выйдешь из того метода где выпустил сигнал (или в qApp->processEvents() или в локальном QEventLoop).

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

Автор: KADABRA 4.2.2010, 20:59
Цитата(SABROG @  4.2.2010,  20:37 Найти цитируемый пост)
Если сигнал межпоточный или Qt::QueuedConnection, то сразу после emit в isOK результата не будет.

А в случае DirectConnection всё-таки сработает, или я ошибаюсь?

Автор: SABROG 4.2.2010, 21:59
Цитата(KADABRA @ 4.2.2010,  20:59)
Цитата(SABROG @  4.2.2010,  20:37 Найти цитируемый пост)
Если сигнал межпоточный или Qt::QueuedConnection, то сразу после emit в isOK результата не будет.

А в случае DirectConnection всё-таки сработает, или я ошибаюсь?

Должно, с DirectConnect сигналы работают как обычный callback.

Автор: sergey_85 5.2.2010, 09:05
Буду использовать Qt::BlockingQueuedConnection или уберу параметр

Добавлено через 2 минуты и 59 секунд
мне и нужен обычный callback smile

Автор: SABROG 5.2.2010, 12:19
Цитата(sergey_85 @ 5.2.2010,  09:05)
Буду использовать Qt::BlockingQueuedConnection или уберу параметр

Добавлено @ 09:08
мне и нужен обычный callback smile

С ним надо поосторожней, если сигнал и слот будут в одном потоке, то это приведет к зависанию приложения (deadlock)

Цитата

Same as QueuedConnection, except the current thread blocks until the slot returns. This connection type should only be used where the emitter and receiver are in different threads. Note: Violating this rule can cause your application to deadlock.


Нужен обычный межпотоковый callback или обычный?

Автор: sergey_85 5.2.2010, 12:39
обычный, все в главном потоке приложения.

Автор: SABROG 5.2.2010, 12:47
Цитата(sergey_85 @ 5.2.2010,  12:39)
обычный, все в главном потоке приложения.

Почему бы тогда не использовать обычный указатель на метод класса или функцию?

Автор: sergey_85 5.2.2010, 15:30
ну можно, но всё-таки Qt, сигналы более удобны smile

Автор: Madonna 5.2.2010, 16:17
Цитата(SABROG @  5.2.2010,  10:47 Найти цитируемый пост)
Почему бы тогда не использовать обычный указатель на метод класса или функцию? 

Быстрее будет + ИМХО проще и нативно.  Модель сигнал-слот использует макросы.  smile 

Автор: andrew_121 5.2.2010, 17:01
Цитата(sergey_85 @  5.2.2010,  15:30 Найти цитируемый пост)
но всё-таки Qt, сигналы более удобны

нет, boost.signals - вот где удобство!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)