Russian Qt Forum
Ноябрь 22, 2024, 19:04
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Многопоточное программирование, процессы
>
Как узнать кто излучил сигнал?
Страниц: [
1
]
2
3
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Как узнать кто излучил сигнал? (Прочитано 18785 раз)
juvf
Программист
Offline
Сообщений: 570
Как узнать кто излучил сигнал?
«
:
Февраль 06, 2011, 14:13 »
В слоте нужно узнать адрес объекта, который испустил сигнал. Можно конечно в параметрах сигнала передавать адрес. А можно ещё как-нибудь? Вроде в Qt для этого есть какие-то методы?
Записан
Fat-Zer
Гость
Re: Как узнать кто излучил сигнал?
«
Ответ #1 :
Февраль 06, 2011, 14:25 »
sender() - прям и не догадаешься...
Записан
Disaron
Гость
Re: Как узнать кто излучил сигнал?
«
Ответ #2 :
Февраль 06, 2011, 14:25 »
QObject::sender()
Записан
Denjs
Гость
Re: Как узнать кто излучил сигнал?
«
Ответ #3 :
Февраль 06, 2011, 16:27 »
Цитата: Disaron от Февраль 06, 2011, 14:25
QObject::sender()
старая песня о главном))) в общем случае - вы и не должны знать. никак и никогда.
про QObject::sender()- как помню, ассистант рассказывает следующее: данный метод противоречит философии сигнал-слотов и работает только внутри одного потока. Если сигнал из другого потока - то метод возвращает "ничего" (оно и понятно - к моменту получения сигнала объект-источник давно уже мог быть уничтожен)
Более того - понимаю так, что из этого следует и то, что работать оно не будет и в одном потоке если метод вызова слота - "квотед коннекшн".
Возможно и при некоторых других типах соединений - тоже (в 4.5 ввели новые типы соединений - потому и не знаю).
В общем, имхо, ссылка на объект-источник типа QPointer передаваемая с сигналом - это получше будет и поуниверсальнее, хотя и "более тяжелая конструкция". но QPointer::isNull() удобен.
«
Последнее редактирование: Февраль 06, 2011, 16:32 от Denjs
»
Записан
Disaron
Гость
Re: Как узнать кто излучил сигнал?
«
Ответ #4 :
Февраль 06, 2011, 17:47 »
Цитата: Denjs от Февраль 06, 2011, 16:27
Цитата: Disaron от Февраль 06, 2011, 14:25
QObject::sender()
старая песня о главном))) в общем случае - вы и не должны знать. никак и никогда.
про QObject::sender()- как помню, ассистант рассказывает следующее: данный метод противоречит философии сигнал-слотов и работает только внутри одного потока. Если сигнал из другого потока - то метод возвращает "ничего" (оно и понятно - к моменту получения сигнала объект-источник давно уже мог быть уничтожен)
Более того - понимаю так, что из этого следует и то, что работать оно не будет и в одном потоке если метод вызова слота - "квотед коннекшн".
Возможно и при некоторых других типах соединений - тоже (в 4.5 ввели новые типы соединений - потому и не знаю).
В общем, имхо, ссылка на объект-источник типа QPointer передаваемая с сигналом - это получше будет и поуниверсальнее, хотя и "более тяжелая конструкция". но QPointer::isNull() удобен.
Замечательное и полезное пояснение, но топикстартер не указал нюансы, которых судя по вопросу и нет. Поэтому кратко: каков вопрос - таков ответ. А в дефолтных условиях однопоточности и дефолтном же состоянии соединения сигнала со слотом - работать будет.
«
Последнее редактирование: Февраль 06, 2011, 17:50 от Disaron
»
Записан
juvf
Программист
Offline
Сообщений: 570
Re: Как узнать кто излучил сигнал?
«
Ответ #5 :
Февраль 06, 2011, 18:29 »
Цитата: Denjs от Февраль 06, 2011, 16:27
Цитата: Disaron от Февраль 06, 2011, 14:25
QObject::sender()
старая песня о главном))) в общем случае - вы и не должны знать. никак и никогда.
про QObject::sender()- как помню, ассистант рассказывает следующее: данный метод противоречит философии сигнал-слотов и работает только внутри одного потока. ....
В общем, имхо, ссылка на объект-источник типа QPointer передаваемая с сигналом - это получше будет и поуниверсальнее, хотя и "более тяжелая конструкция". но QPointer::isNull() удобен.
Спасибо за разъяснение. В моём случае как раз сигнал из др. потока.
Записан
serg_hd
Хакер
Offline
Сообщений: 668
Re: Как узнать кто излучил сигнал?
«
Ответ #6 :
Февраль 06, 2011, 19:47 »
Цитата: Denjs от Февраль 06, 2011, 16:27
Если сигнал из другого потока - то метод возвращает "ничего" (оно и понятно - к моменту получения сигнала объект-источник давно уже мог быть уничтожен)
неверно, при типе DirectConnection всё ок
Записан
kubuntu/Win7/x64/NetBeans
Fat-Zer
Гость
Re: Как узнать кто излучил сигнал?
«
Ответ #7 :
Февраль 06, 2011, 19:56 »
Цитата: serg_hd от Февраль 06, 2011, 19:47
Цитата: Denjs от Февраль 06, 2011, 16:27
Если сигнал из другого потока - то метод возвращает "ничего" (оно и понятно - к моменту получения сигнала объект-источник давно уже мог быть уничтожен)
неверно, при типе DirectConnection всё ок
Из другого птока можно только QueuedConnection... всё остальное черевато большими проблеммами...
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Как узнать кто излучил сигнал?
«
Ответ #8 :
Февраль 06, 2011, 20:02 »
Цитата: Fat-Zer от Февраль 06, 2011, 19:56
Из другого птока можно только QueuedConnection... всё остальное черевато большими проблеммами...
QBlockedQueuedConnection гарантирует что отправитель жив (он ждет ответа). Ну конечно если устроит по скорости
Записан
serg_hd
Хакер
Offline
Сообщений: 668
Re: Как узнать кто излучил сигнал?
«
Ответ #9 :
Февраль 06, 2011, 20:18 »
Цитата: Fat-Zer от Февраль 06, 2011, 19:56
Из другого птока можно только QueuedConnection... всё остальное черевато большими проблеммами...
не чревато, у меня рабочий проект, веб-серфер работает как раз по такому принципу: второстепенные потоки шлют сигналы на главный гуишный поток (с целью создания qwebview), тип сигнала directconnection. Потоков доходило одновременно до 400, проблем никаких никогда не возникало.
Записан
kubuntu/Win7/x64/NetBeans
Fat-Zer
Гость
Re: Как узнать кто излучил сигнал?
«
Ответ #10 :
Февраль 06, 2011, 20:51 »
Цитата: serg_hd от Февраль 06, 2011, 20:18
не чревато, у меня рабочий проект, веб-серфер работает как раз по такому принципу: второстепенные потоки шлют сигналы на главный гуишный поток (с целью создания qwebview), тип сигнала directconnection. Потоков доходило одновременно до 400, проблем никаких никогда не возникало.
у меня тоже на linux'e нормально работало, но при переносе на винду всё полетело. По сигналу из дочернего потока нужно было сделать ресайз окна... так вот это и падало. Да и прогрес бар не обновлялся.
Дело в том, что при директ коннекшине код ГУИ потока будет исполняться в дочернем потоке, что само по себе опасно. Некоторые системы, например, иксы это могут переваривать, а некоторые - нет. (мог ошибиться в своих выводах)
То что у вас не возникало проблем - ИМХО чистая удача...
ЗЫ: сейчас попробую набросать пример.
Записан
Fat-Zer
Гость
Re: Как узнать кто излучил сигнал?
«
Ответ #11 :
Февраль 06, 2011, 21:23 »
А вот и пример(в аттаче)
Оказывается наврал... на линуксе тоже падает, зато хорошо показыват что так делать нельзя.
Записан
juvf
Программист
Offline
Сообщений: 570
Re: Как узнать кто излучил сигнал?
«
Ответ #12 :
Февраль 06, 2011, 21:24 »
Цитата: Fat-Zer от Февраль 06, 2011, 20:51
Дело в том, что при директ коннекшине код ГУИ потока будет исполняться в дочернем потоке, что само по себе опасно.
Почитал асистент ещё раз про директКонекшн.
Цитировать
The slot is invoked immediately, when the signal is emitted.
Ни слово про то, что слот будет выполнятся в потоке излучателя сигнала.
Записан
Fat-Zer
Гость
Re: Как узнать кто излучил сигнал?
«
Ответ #13 :
Февраль 06, 2011, 21:33 »
juvf
, не там читали:
Цитата: Threads and QObjects
Direct Connection The slot is invoked immediately, when the signal is emitted. The slot is executed in the emitter's thread, which is not necessarily the receiver's thread.
Записан
Disaron
Гость
Re: Как узнать кто излучил сигнал?
«
Ответ #14 :
Февраль 06, 2011, 21:58 »
Цитата: Fat-Zer от Февраль 06, 2011, 21:23
А вот и пример(в аттаче)
Оказывается наврал... на линуксе тоже падает, зато хорошо показыват что так делать нельзя.
Видимо зависит от линукса и от версии кьют. У меня не падает, но при директе гадит:
Код:
QObject::setParent: Cannot set parent, new parent is in a different thread
что вполне естественно.
Записан
Страниц: [
1
]
2
3
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
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 сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...