LINUX.ORG.RU

Qt: константные ссылки в сигналах и слотах

 ,


0

3

Привет, эксперты. Есть Один Пример (из официальной документации Qt, по работе с последовательным портом), в котором используется сабж.

Линки: .h, .cpp.

Кусок из .h:

signals:
	void response(const QString &s);
	void error(const QString &s);
	void timeout(const QString &s);
Кусок из .cpp:
if (serial.waitForBytesWritten(m_waitTimeout)) {
	if (serial.waitForReadyRead(currentWaitTimeout)) {
		QByteArray responseData = serial.readAll();
		while (serial.waitForReadyRead(10))
			responseData += serial.readAll();
			const QString response = QString::fromUtf8(responseData);
			emit this->response(response);		// СИГНАЛ 1
	} else {
		emit timeout(tr("Wait read response timeout %1")
			.arg(QTime::currentTime().toString()));	// СИГНАЛ 2
	}
} else {
	emit timeout(tr("Wait write request timeout %1")
		.arg(QTime::currentTime().toString()));		// СИГНАЛ 3
}

Собственно, вопрос, разве объекты, ссылки на которые передаются сигналами 1-2-3 не должны быть незамедлительно уничтожены после emit'ов? Поскольку процитированный кусок кода, вроде как, выполняется в отдельном потоке, то будет использовано соединение Qt::QueuedConnection, поэтому слот приемника (receiver) формально может выполниться тогда, когда объекты, с которыми связаны ссылки, будут уже уничтожены.

Или нет?


Ответ на: комментарий от s3rjke

Копирование происходит при помещении в очередь. При AutoConnection очередь используется только в том случае, если сигнал посылается из другого потока. Если объект, со слотом которого соединён сигнал, работает в том же потоке, посылка сигнала почти что аналогична простому вызову слота как функции

XMs ★★★★★
()
Ответ на: комментарий от XMs

Т.е. ссылки в данном примере используются из расчета «а вдруг emitter и receiver окажутся в одном потоке»? Так-то там все сигналы идут из метода run, который выполняется в другом потоке.

s3rjke
() автор топика
Ответ на: комментарий от s3rjke

На самом деле, в данном случае разницы почти нет, так как QString — implicit shared, и даже при копировании в другой тред копируются не все данные, а только указатель на внутренний класс

XMs ★★★★★
()
Ответ на: комментарий от s3rjke

Т.е. ссылки в данном примере используются из расчета «а вдруг emitter и receiver окажутся в одном потоке»?

не писать же 2 сигнала одного и того же )

x905 ★★★★★
()
Ответ на: комментарий от s3rjke

Константные ссылки в слотах нужны, чтобы копирование не происходило при вызове слота, а происходило только при помещении в очередь

annulen ★★★★★
()
Ответ на: комментарий от annulen

Получается, что если передаются небольшие объекты, нужно всегда использовать константные ссылки. Кстати говоря, ты не в курсе, какие накладные расходы у std::shared_ptr и std::unique_ptr?

s3rjke
() автор топика
Ответ на: комментарий от s3rjke

У unique_ptr нет накладных расходов, если его deleter не имеет состояния, а shared_ptr содержит указатель на общий блок памяти с атомарными счетчиками

annulen ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.