Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сигналы возвращающие значение, signal & return  
:(
    Опции темы
sergey_85
Дата 4.2.2010, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 17.4.2007
Где: Россия, Челябинск

Репутация: нет
Всего: 1



Привет!

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

Код

class MyClass: public QObject
{
 Q_OBJECT

...

signals:
    bool SendMsg(); //
};

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

...


Спасибо!

Это сообщение отредактировал(а) sergey_85 - 4.2.2010, 14:18


--------------------
A good design always pays off.
PM MAIL   Вверх
andrew_121
Дата 4.2.2010, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 11
Всего: 33



нельзя. где-то в документации по сигнал-слотовой модели это описано.
для этого есть boost.signals


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
sergey_85
Дата 4.2.2010, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 17.4.2007
Где: Россия, Челябинск

Репутация: нет
Всего: 1



ок

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

Код

class MyClass: public QObject
{
 Q_OBJECT

...

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

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


...



--------------------
A good design always pays off.
PM MAIL   Вверх
KADABRA
Дата 4.2.2010, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 30.8.2007

Репутация: 2
Всего: 3



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

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

Да.
PM MAIL   Вверх
SABROG
Дата 4.2.2010, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



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

Код

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


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

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


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
KADABRA
Дата 4.2.2010, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 30.8.2007

Репутация: 2
Всего: 3



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

А в случае DirectConnection всё-таки сработает, или я ошибаюсь?
PM MAIL   Вверх
SABROG
Дата 4.2.2010, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



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

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

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


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
sergey_85
Дата 5.2.2010, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 17.4.2007
Где: Россия, Челябинск

Репутация: нет
Всего: 1



Буду использовать Qt::BlockingQueuedConnection или уберу параметр

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


--------------------
A good design always pays off.
PM MAIL   Вверх
SABROG
Дата 5.2.2010, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(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 или обычный?


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
sergey_85
Дата 5.2.2010, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 17.4.2007
Где: Россия, Челябинск

Репутация: нет
Всего: 1



обычный, все в главном потоке приложения.


--------------------
A good design always pays off.
PM MAIL   Вверх
SABROG
Дата 5.2.2010, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



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

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


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
sergey_85
Дата 5.2.2010, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 17.4.2007
Где: Россия, Челябинск

Репутация: нет
Всего: 1



ну можно, но всё-таки Qt, сигналы более удобны smile


--------------------
A good design always pays off.
PM MAIL   Вверх
Madonna
Дата 5.2.2010, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Forbidden love...
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 22.1.2009
Где: Москва

Репутация: 3
Всего: 4



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

Быстрее будет + ИМХО проще и нативно.  Модель сигнал-слот использует макросы.  smile 
--------------------
Best regards, Madonna
PM   Вверх
andrew_121
Дата 5.2.2010, 17:01 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 11
Всего: 33



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

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


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0926 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.