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