Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [qt] задание параметра слоту 
V
    Опции темы
andrew_121
Дата 11.3.2010, 03:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



SABROG, я тут набросал пример, и не понимаю, как я могу получить значение возвращаемое слотом, при испускании сигнала?
я даже не представляю как это описать синтаксически. сигналы/слоты в Qt ведь не объекты.
в моем представлении, сигнал и слот, должны быть объектами. тогда все понятно. но в данном случае, нет.
Код

#include <iostream>

#include <QtCore/QObject>
#include <QtCore/QTimer>

/***************************************************************************/

class sender: public QObject {
    Q_OBJECT
public:
    sender(const int time = 1000, QObject* parent = NULL):QObject(parent) {
        QTimer::singleShot(time, this, SIGNAL(my_signal()));
    }

signals:
    int my_signal();
};

/***************************************************************************/

class receiver: public QObject {
    Q_OBJECT
public:
    receiver(QObject* parent = NULL):QObject(parent) {}

public slots:
    int my_slot() {
        std::cout << "called" << std::endl;
        return 33;
    }
};

/***************************************************************************/

int main(int argc, char** argv) {
    QApplication app(argc, argv);

    sender sender;
    receiver receiver;

    QObject::connect(&sender, SIGNAL(my_signal()), &receiver, SLOT(my_slot()));

    return app.exec();
}

/***************************************************************************/


Это сообщение отредактировал(а) andrew_121 - 11.3.2010, 03:59


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


Hacker
****


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

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



Цитата(andrew_121 @  11.3.2010,  02:02 Найти цитируемый пост)
этот тип соединения я знаю. вот только не уверен что сигнал вернет значение, возвращаемое слотом. нужно экспериментировать.

В этом случае сигналы даже не нужны, достаточно простого вызова слота:

Код

int retVal;
QMetaObject::invokeMetod(objectInOtherThread, "someslot()", Qt::BlockingQueuedConnection, Q_RETURN_ARG(int, retVal), Q_ARG(QString, "test"));
if (retVal == X)

Вообще использование сигналов и слотов в Qt не обязательное условие о чем тролли и пишут. Можно тот же паттерн Observer сделать. Просто нужно позаботится о мутексах или атомарных операциях, чтобы сделать его потокобезопасным.

Цитата(andrew_121 @  11.3.2010,  02:02 Найти цитируемый пост)
вот подумал....и не вспомнил ситуации, когда этот факт мне реально мешал.

С тем же успехом можно вообще отдельный поток не создавать. Реальная ситуация, главный поток принимает соединения от клиентов, второй поток выполняет тяжелую работу над запросом. В случае с boost::signals2 пока отдельный поток выполняет тяжелую работу основной поток не знает подключился ли кто-то еще или нет, а из-за долгого молчания сервера на клиентской стороне начинает тикать таймаут в 60 секунд. Если твой второй поток за это время не уложится, то клиент отключится даже не узнав по какой причине его не пустили на сервер.

Цитата(andrew_121 @  11.3.2010,  02:02 Найти цитируемый пост)

я конечно понимаю, что асинхронные сигналы это удобно. но не всегда! так же как и синхронные.

К счастью в Qt есть выбор.

Цитата(andrew_121 @  11.3.2010,  03:56 Найти цитируемый пост)
SABROG, я тут набросал пример, и не понимаю, как я могу получить значение возвращаемое слотом, при испускании сигнала?

Передавай в качестве параметра сигнала указатель типа QWeakPointer и меняй значение. Сигнал испускай сам, а не через QTimer. Можно даже так сделать:

Код

emit someSignal(retVal);
qApp->processEvents();
if (retVal->value == X)



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


Кодофей
****


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

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



Цитата(SABROG @  11.3.2010,  09:58 Найти цитируемый пост)
еальная ситуация, главный поток принимает соединения от клиентов, второй поток выполняет тяжелую работу над запросом

для работы с сетью и вводом-выводом(в том числе и файловым(мультиплексированым и асинхронным)) использую asio, потому такой проблемы не возникало.
а вообще, если понять архитектуру asio и принцип организации, то становится ясно, почему при работе с ней, не возникает подобных проблем. а ведь в ней все основано функциональных объектах.


Цитата(SABROG @  11.3.2010,  09:58 Найти цитируемый пост)
int retVal;
QMetaObject::invokeMetod(objectInOtherThread, "someslot()", Qt::BlockingQueuedConnection, Q_RETURN_ARG(int, retVal), Q_ARG(QString, "test"));
if (retVal == X)

вы часто видели в пользовательском коде такое? я нет)


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


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


Hacker
****


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

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



Цитата(andrew_121 @  11.3.2010,  10:46 Найти цитируемый пост)
вы часто видели в пользовательском коде такое? я нет)

Не видел. Потому, что мало кто зацикливается на том, что слот или сигнал должен вернуть значение. Как я уже говорил не сигналами со слотами едиными жив C++.

Цитата(andrew_121 @  11.3.2010,  10:46 Найти цитируемый пост)
для работы с сетью и вводом-выводом(в том числе и файловым(мультиплексированым и асинхронным)) использую asio, потому такой проблемы не возникало.
а вообще, если понять архитектуру asio и принцип организации, то становится ясно, почему при работе с ней, не возникает подобных проблем. а ведь в ней все основано функциональных объектах.

В asio только один плюс - Completion Port. В остальном он использует те же API и неблокирующие сокеты как и Qt. Я предложил уже троллям "допилить" модуль QtNetwork, чтобы эвенты сокетов получать через Completion Port. Пока ни ответа ни привета.



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


Кодофей
****


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

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



Цитата(SABROG @  11.3.2010,  12:01 Найти цитируемый пост)
В asio только один плюс - Completion Port

это, если я не ошибаюсь, толь вендовая модель?


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


Hacker
****


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

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



Цитата(andrew_121 @  11.3.2010,  12:05 Найти цитируемый пост)
это, если я не ошибаюсь, толь вендовая модель? 

Да, под *nix'ы это уже другой вопрос. Но я им инфу и для *nix'ов бросил.


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

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

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


 




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


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

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