Russian Qt Forum
Ноябрь 24, 2024, 00:45
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Общие вопросы
>
Сигналы и конструкторы\деструкторы\область видимости
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Сигналы и конструкторы\деструкторы\область видимости (Прочитано 5582 раз)
Narsil
Гость
Сигналы и конструкторы\деструкторы\область видимости
«
:
Май 19, 2010, 19:42 »
Доброго времени суток. Прошу прощения, елси данный вопрос поднимался, поиск не дал вразумительных результатов (по крайней мере по данному разделу)
Вот предположим, есть некоторый сигнал
Код:
void signal(QString);
Теперь предположим у нас есть такой код:
Код:
{
QString str(message);
emit signal(str);
}
где message имеет тип char*, которая дальше удаляется. Но строка, которую мы хотим передать помещается в объект str.
Далее, предположим у нас многопоточное приложение, и данный сигнал связан со слотом другого потока. Насколько я понял, если мы используем Qt::AutoConnection при связывании, в многопоточном приложении объект str будет помещен в некоторую очередь (наверняка через копирующий конструктор), и управление вернется в приведенный код. После этого объект str выходит из области видимости, и вызывается деструктор.
И вот собственно вопрос. Что происходит дальше? Именно в реализации механизма сигнал-слот. Распишите подробно, как данный объект (помещенный в очередь) будет жить дальше в случае с одним связанным слотом, нуля связанных слотов или нескольких. Когда для данного объекта будут вызываться копирующие конструкторы, когда будет вызываться operator = и когда вызовется деструктор.
Записан
ритт
Гость
Re: Сигналы и конструкторы\деструкторы\область видимости
«
Ответ #1 :
Май 19, 2010, 21:22 »
всё это можно найти в официальной документации.
Записан
Narsil
Гость
Re: Сигналы и конструкторы\деструкторы\область видимости
«
Ответ #2 :
Май 19, 2010, 21:27 »
Был бы очень благодарен за ссылку. Какие-то оф. доки я читал, но не наталкивался даже на отдалённые упоминания.
К тому же, оф. докам не задашь вопрос, если что-то будет непонятно\не до конца понятно.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Сигналы и конструкторы\деструкторы\область видимости
«
Ответ #3 :
Май 19, 2010, 22:12 »
Мне кажется проще и лучше посмотреть invokeMethod по исходникам - как минимум информация из первых рук
Цитата: Narsil от Май 19, 2010, 19:42
Далее, предположим у нас многопоточное приложение, и данный сигнал связан со слотом другого потока. Насколько я понял, если мы используем Qt::AutoConnection при связывании, в многопоточном приложении объект str будет помещен в некоторую очередь (наверняка через копирующий конструктор), и управление вернется в приведенный код. После этого объект str выходит из области видимости, и вызывается деструктор.
"В общих чертах" - совершенно верно. Конкретно - не следует надеяться на какие-то чудесные правила многопоточности которые сами все сделают
Цитата: Narsil от Май 19, 2010, 19:42
И вот собственно вопрос. Что происходит дальше? Именно в реализации механизма сигнал-слот. Распишите подробно, как данный объект (помещенный в очередь) будет жить дальше в случае с одним связанным слотом, нуля связанных слотов или нескольких. Когда для данного объекта будут вызываться копирующие конструкторы, когда будет вызываться operator = и когда вызовется деструктор.
Я понимаю (и уважаю) желание "докопаться" но для пользования оно совсем необязательно. Ваш пример: Вы послали str - значит он будет доставлен слоту. Конкретно в Вашем примере Вы послали по значению - здесь вообще вопросов нет. Послали по ссылке/указателю - значит при многопоточном использовании Вы должны иметь ввиду - поезд может уйти, слоту доставлена та копия/версия что посылалась. Насколько я помню,
Dendy
неоднократно объяснял этот момент
Записан
Narsil
Гость
Re: Сигналы и конструкторы\деструкторы\область видимости
«
Ответ #4 :
Май 19, 2010, 22:29 »
Цитата: Igors от Май 19, 2010, 22:12
Мне кажется проще и лучше посмотреть invokeMethod по исходникам - как минимум информация из первых рук
С invokeMethod у меня сразу не заладились отношения.
Цитата: Igors от Май 19, 2010, 22:12
Я понимаю (и уважаю) желание "докопаться" но для пользования оно совсем необязательно. Ваш пример: Вы послали str - значит он будет доставлен слоту. Конкретно в Вашем примере Вы послали по значению - здесь вообще вопросов нет. Послали по ссылке/указателю - значит при многопоточном использовании Вы должны иметь ввиду - поезд может уйти, слоту доставлена та копия/версия что посылалась.
Дело в том, что моя задача разработать систему, которая будет работать очень длительное время без остановок. Поэтому утечки памяти (даже небольшие) очень нежелательны. Вот отсюда и желание докопаться до механизма реализации сигнал-слотов, ибо идея, конечно, привлекательная.
Цитата: Igors от Май 19, 2010, 22:12
Насколько я помню,
Dendy
неоднократно объяснял этот момент
Приветствую любые ссылки по данному вопросу. Я просто не очень представляю как составить поисковой запрос, чтобы получить то, что я хочу.
Записан
SASA
Гость
Re: Сигналы и конструкторы\деструкторы\область видимости
«
Ответ #5 :
Май 20, 2010, 15:19 »
Цитата: Narsil от Май 19, 2010, 19:42
Код:
{
QString str(message);
emit signal(str);
}
В этом коде ничего не создаётся динамически. Если предположить, что в QString и реализации сигналов/слотов утечек нет, то этот код тоже не будет "протекать".
Записан
Narsil
Гость
Re: Сигналы и конструкторы\деструкторы\область видимости
«
Ответ #6 :
Май 23, 2010, 22:24 »
Ладно, тогда следующий вопрос. Есть ли разница с точки зрения Qt в пердаче параметров как "Classname" или как "Classname &"?
Записан
SASA
Гость
Re: Сигналы и конструкторы\деструкторы\область видимости
«
Ответ #7 :
Май 24, 2010, 17:39 »
Это вопрос по C++,а не по Qt. Почитайте про способы передачи параметров в C++.
Записан
kibsoft
Хакер
Offline
Сообщений: 625
Re: Сигналы и конструкторы\деструкторы\область видимости
«
Ответ #8 :
Май 24, 2010, 18:07 »
Цитата: Narsil от Май 23, 2010, 22:24
Ладно, тогда следующий вопрос. Есть ли разница с точки зрения Qt в пердаче параметров как "Classname" или как "Classname &"?
Есть. Почитай про Implicit Sharing в ассистенте. Когда передается копия(Classname) например QString, то неявно в Qt передается ссылка(для увеличения эффективности) и увеличивается счетчик ссылок на этот объект, а затем если в функции происходит изменение этого объекта, то счетчик ссылок уменьшается и создается копия объекта(в функции). Передача по ссылке(Classname &) происходит обычно, т.е. передается ссылка и при изменении в функции будет изменен тот объект, который передан(копия не будет создаваться). И никакого счетчика ссылок во втором случае нету.
Записан
http://kibsoft.ru
- Download the Qt Media Encoding Library here
The apps that were written using QtMEL:
http://srecorder.com
- Screen recording software
Alex Custov
Джедай : наставник для всех
Offline
Сообщений: 2063
Re: Сигналы и конструкторы\деструкторы\область видимости
«
Ответ #9 :
Май 24, 2010, 18:50 »
Цитата: kibsoft от Май 24, 2010, 18:07
Есть. Почитай про Implicit Sharing в ассистенте. Когда передается копия(Classname) например QString, то неявно в Qt передается ссылка(для увеличения эффективности) и увеличивается счетчик ссылок на этот объект, а затем если в функции происходит изменение этого объекта, то счетчик ссылок уменьшается и создается копия объекта(в функции). Передача по ссылке(Classname &) происходит обычно, т.е. передается ссылка и при изменении в функции будет изменен тот объект, который передан(копия не будет создаваться). И никакого счетчика ссылок во втором случае нету.
Важно добавить, что это справедливо для типа соединения Qt::DirectConnection
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Сигналы и конструкторы\деструкторы\область видимости
«
Ответ #10 :
Май 24, 2010, 21:19 »
Цитата: Narsil от Май 19, 2010, 22:29
Дело в том, что моя задача разработать систему, которая будет работать очень длительное время без остановок. Поэтому утечки памяти (даже небольшие) очень нежелательны. Вот отсюда и желание докопаться до механизма реализации сигнал-слотов, ибо идея, конечно, привлекательная.
Детальный разбор механизма сигнал/слот - дело хорошее, но как это связано с утечками? Они постоянно обнаруживаются, напр. в последний месяц-полтора их находили
Dr_Behemot
и
Spectre
. Однако от факта обнаружения до выявления причины - дистанция огромного размера (не говоря уже о фиксации). Обычно дело кончается ничем и (у)течка спокойно живет дальше
Заметим что сигнал/слот активно используется самим Qt и избавиться от этого нельзя. Да и нет никаких поводов считать сигнал/слот причиной утечек. Так что Ваш план не очень понятен.
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...