Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: sergek от Июнь 20, 2017, 21:36



Название: [РЕШЕНО] Локальные объекты в сигналах
Отправлено: sergek от Июнь 20, 2017, 21:36
Коллеги,
поясните, пожалуйста, когда безопасно передавать сигналом объект пользовательского класса, если объект - локальная переменная, а соединение - QueuedConnection.
Погуглил, нашел прямо противополжные мнения. Например, утверждается, что если в сигнале параметр объявлен константной ссылкой, то работает implisit sharing. Но это, видимо, для классов Qt. А для пользовательских, не порожденных от QObject что происходит - копирование?

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

Что придет в слот - копия объекта или ссылка?
Для соединения QueuedConnection есть разница, сигнал и слот находятся в одном потоке или разных?


Название: Re: Локальные объекты в сигналах
Отправлено: qate от Июнь 21, 2017, 11:03
копия должна приходить, проверить можно поставив в конструкторе вывод


Название: Re: Локальные объекты в сигналах
Отправлено: Old от Июнь 21, 2017, 11:17
В общем виде:
Для Qt::DirectConnection - ссылка;
для Qt::QueuedConnection - копия.


Название: Re: Локальные объекты в сигналах
Отправлено: sergek от Июнь 21, 2017, 11:37
А в документации Qt вы встречали что-нибудь подобное о параметрах, передаваемых сигналами?
Вчера вечер на это убил, ничего толкового не нашел.


Название: Re: Локальные объекты в сигналах
Отправлено: Old от Июнь 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 работает через очередь сообщений, т.е. все параметры упаковываются в объект-событие, которое и помещается в очередь получателя. При обработке этого события, параметры извлекаются из события и генерируется сигнал.


Название: Re: Локальные объекты в сигналах
Отправлено: Old от Июнь 21, 2017, 12:16
По Qt::QueuedConnection есть предложение под таблицей с описанием типов подключения.


Название: Re: Локальные объекты в сигналах
Отправлено: sergek от Июнь 21, 2017, 12:32
Верно, "because Qt needs to copy the arguments to store them in an event behind the scenes", пропустил.
Интересно, а если аргументом является указатель на объект? Или неконстантная ссылка?


Название: Re: Локальные объекты в сигналах
Отправлено: Old от Июнь 21, 2017, 12:45
Интересно, а если аргументом является указатель на объект? Или неконстантная ссылка?
Для Qt::QueuedConnection будет копия указателя и копия объекта по ссылке.


Название: Re: Локальные объекты в сигналах
Отправлено: sergek от Июнь 21, 2017, 13:12
Ну и хорошо. Спасибо.