Russian Qt Forum
Ноябрь 22, 2024, 14:02 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Локальные объекты в сигналах  (Прочитано 6491 раз)
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« : Июнь 20, 2017, 21:36 »

Коллеги,
поясните, пожалуйста, когда безопасно передавать сигналом объект пользовательского класса, если объект - локальная переменная, а соединение - QueuedConnection.
Погуглил, нашел прямо противополжные мнения. Например, утверждается, что если в сигнале параметр объявлен константной ссылкой, то работает implisit sharing. Но это, видимо, для классов Qt. А для пользовательских, не порожденных от QObject что происходит - копирование?

Код:
signals:
    void responseSig(const MyClass &vars);
...
Генерация сигнала:
Код:
{
    MyClass vars;
    emit responseSig(vars);
}

Что придет в слот - копия объекта или ссылка?
Для соединения QueuedConnection есть разница, сигнал и слот находятся в одном потоке или разных?
« Последнее редактирование: Июнь 21, 2017, 13:13 от sergek » Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #1 : Июнь 21, 2017, 11:03 »

копия должна приходить, проверить можно поставив в конструкторе вывод
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #2 : Июнь 21, 2017, 11:17 »

В общем виде:
Для Qt::DirectConnection - ссылка;
для Qt::QueuedConnection - копия.
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #3 : Июнь 21, 2017, 11:37 »

А в документации Qt вы встречали что-нибудь подобное о параметрах, передаваемых сигналами?
Вчера вечер на это убил, ничего толкового не нашел.
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #4 : Июнь 21, 2017, 12:08 »

А в документации Qt вы встречали что-нибудь подобное о параметрах, передаваемых сигналами?
Вчера вечер на это убил, ничего толкового не нашел.
Честно говоря, никогда не искал эту информацию.

По внутреннему устройству Qt::DirectConnection сводится к прямому вызову слота, поэтому будет работать даже не константная ссылка:
Код
C++ (Qt)
 
signals:
   void sig( QStringList &vals );
 
...
 
void callSig()
{
   QStringList vals;
   emit sig( vals );    // Для Qt::DirectConnection эквивалентно прямому вызову slot( vals )
 
   qDebug() << vals.size();
}
 
void slot( QStringList &val )
{
   val << "val1" << "val2" << "val3";
}
 
connect( a, SIGNAL(sig(QStringList)), b, SLOT(slot(QStringList)) );
 

А Qt::QueuedConnection работает через очередь сообщений, т.е. все параметры упаковываются в объект-событие, которое и помещается в очередь получателя. При обработке этого события, параметры извлекаются из события и генерируется сигнал.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #5 : Июнь 21, 2017, 12:16 »

По Qt::QueuedConnection есть предложение под таблицей с описанием типов подключения.
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #6 : Июнь 21, 2017, 12:32 »

Верно, "because Qt needs to copy the arguments to store them in an event behind the scenes", пропустил.
Интересно, а если аргументом является указатель на объект? Или неконстантная ссылка?
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #7 : Июнь 21, 2017, 12:45 »

Интересно, а если аргументом является указатель на объект? Или неконстантная ссылка?
Для Qt::QueuedConnection будет копия указателя и копия объекта по ссылке.
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #8 : Июнь 21, 2017, 13:12 »

Ну и хорошо. Спасибо.
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.172 секунд. Запросов: 23.