Russian Qt Forum
Ноябрь 23, 2024, 00:56 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Как узнать кто излучил сигнал?  (Прочитано 18811 раз)
juvf
Программист
*****
Offline Offline

Сообщений: 570


Просмотр профиля
« : Февраль 06, 2011, 14:13 »

В слоте нужно узнать адрес объекта, который испустил сигнал. Можно конечно в параметрах сигнала передавать адрес. А можно ещё как-нибудь? Вроде в Qt для этого есть какие-то методы?
Записан
Fat-Zer
Гость
« Ответ #1 : Февраль 06, 2011, 14:25 »

sender() - прям и не догадаешься...
Записан
Disaron
Гость
« Ответ #2 : Февраль 06, 2011, 14:25 »

QObject::sender()
Записан
Denjs
Гость
« Ответ #3 : Февраль 06, 2011, 16:27 »

QObject::sender()
старая песня о главном))) в общем случае - вы и не должны знать. никак и никогда.
про QObject::sender()- как помню, ассистант рассказывает следующее: данный метод противоречит философии сигнал-слотов и работает только внутри одного потока. Если сигнал из другого потока - то метод возвращает "ничего" (оно и понятно - к моменту получения сигнала объект-источник давно уже мог быть уничтожен)

Более того - понимаю так, что из этого следует и то, что работать оно не будет и в одном потоке если метод вызова слота - "квотед коннекшн".
Возможно и при некоторых других типах соединений - тоже (в 4.5 ввели  новые типы соединений - потому и не знаю).

В общем, имхо, ссылка на объект-источник типа QPointer передаваемая с сигналом - это получше будет и поуниверсальнее, хотя и "более тяжелая конструкция". но QPointer::isNull() удобен.
« Последнее редактирование: Февраль 06, 2011, 16:32 от Denjs » Записан
Disaron
Гость
« Ответ #4 : Февраль 06, 2011, 17:47 »

QObject::sender()
старая песня о главном))) в общем случае - вы и не должны знать. никак и никогда.
про QObject::sender()- как помню, ассистант рассказывает следующее: данный метод противоречит философии сигнал-слотов и работает только внутри одного потока. Если сигнал из другого потока - то метод возвращает "ничего" (оно и понятно - к моменту получения сигнала объект-источник давно уже мог быть уничтожен)

Более того - понимаю так, что из этого следует и то, что работать оно не будет и в одном потоке если метод вызова слота - "квотед коннекшн".
Возможно и при некоторых других типах соединений - тоже (в 4.5 ввели  новые типы соединений - потому и не знаю).

В общем, имхо, ссылка на объект-источник типа QPointer передаваемая с сигналом - это получше будет и поуниверсальнее, хотя и "более тяжелая конструкция". но QPointer::isNull() удобен.
Замечательное и полезное пояснение, но топикстартер не указал нюансы, которых судя по вопросу и нет. Поэтому кратко: каков вопрос - таков ответ. А в дефолтных условиях однопоточности и дефолтном же состоянии соединения сигнала со слотом - работать будет.
« Последнее редактирование: Февраль 06, 2011, 17:50 от Disaron » Записан
juvf
Программист
*****
Offline Offline

Сообщений: 570


Просмотр профиля
« Ответ #5 : Февраль 06, 2011, 18:29 »

QObject::sender()
старая песня о главном))) в общем случае - вы и не должны знать. никак и никогда.
про QObject::sender()- как помню, ассистант рассказывает следующее: данный метод противоречит философии сигнал-слотов и работает только внутри одного потока. ....

В общем, имхо, ссылка на объект-источник типа QPointer передаваемая с сигналом - это получше будет и поуниверсальнее, хотя и "более тяжелая конструкция". но QPointer::isNull() удобен.
Спасибо за разъяснение. В моём случае как раз сигнал из др. потока.
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #6 : Февраль 06, 2011, 19:47 »

Если сигнал из другого потока - то метод возвращает "ничего" (оно и понятно - к моменту получения сигнала объект-источник давно уже мог быть уничтожен)
неверно, при типе DirectConnection всё ок Подмигивающий
Записан

kubuntu/Win7/x64/NetBeans
Fat-Zer
Гость
« Ответ #7 : Февраль 06, 2011, 19:56 »

Если сигнал из другого потока - то метод возвращает "ничего" (оно и понятно - к моменту получения сигнала объект-источник давно уже мог быть уничтожен)
неверно, при типе DirectConnection всё ок Подмигивающий
Из другого птока можно только QueuedConnection... всё остальное черевато большими проблеммами...
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Февраль 06, 2011, 20:02 »

Из другого птока можно только QueuedConnection... всё остальное черевато большими проблеммами...
QBlockedQueuedConnection гарантирует что отправитель жив (он ждет ответа). Ну конечно если устроит по скорости
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #9 : Февраль 06, 2011, 20:18 »

Из другого птока можно только QueuedConnection... всё остальное черевато большими проблеммами...
не чревато, у меня рабочий проект, веб-серфер работает как раз по такому принципу: второстепенные потоки шлют сигналы на главный гуишный поток (с целью создания qwebview), тип сигнала directconnection. Потоков доходило одновременно до 400, проблем никаких никогда не возникало.
Записан

kubuntu/Win7/x64/NetBeans
Fat-Zer
Гость
« Ответ #10 : Февраль 06, 2011, 20:51 »

не чревато, у меня рабочий проект, веб-серфер работает как раз по такому принципу: второстепенные потоки шлют сигналы на главный гуишный поток (с целью создания qwebview), тип сигнала directconnection. Потоков доходило одновременно до 400, проблем никаких никогда не возникало.
у меня тоже на linux'e нормально работало, но при переносе  на винду всё полетело. По сигналу из дочернего потока нужно было сделать ресайз окна... так вот это и падало. Да и прогрес бар не обновлялся.
Дело в том, что при директ коннекшине код ГУИ потока будет исполняться в дочернем потоке, что само по себе опасно. Некоторые системы, например, иксы это могут переваривать, а некоторые - нет. (мог ошибиться в своих выводах)
То что у вас не возникало проблем - ИМХО чистая удача...
ЗЫ: сейчас попробую набросать пример.
Записан
Fat-Zer
Гость
« Ответ #11 : Февраль 06, 2011, 21:23 »

А вот и пример(в аттаче)
Оказывается наврал... на линуксе тоже падает, зато хорошо показыват что так делать нельзя.
Записан
juvf
Программист
*****
Offline Offline

Сообщений: 570


Просмотр профиля
« Ответ #12 : Февраль 06, 2011, 21:24 »

Дело в том, что при директ коннекшине код ГУИ потока будет исполняться в дочернем потоке, что само по себе опасно.
Почитал асистент ещё раз про директКонекшн.
Цитировать
The slot is invoked immediately, when the signal is emitted.
Ни слово про то, что слот будет выполнятся в потоке излучателя сигнала.
Записан
Fat-Zer
Гость
« Ответ #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
Гость
« Ответ #14 : Февраль 06, 2011, 21:58 »

А вот и пример(в аттаче)
Оказывается наврал... на линуксе тоже падает, зато хорошо показыват что так делать нельзя.
Видимо зависит от линукса и от версии кьют. У меня не падает, но при директе гадит:
Код:
QObject::setParent: Cannot set parent, new parent is in a different thread
что вполне естественно. Улыбающийся
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.054 секунд. Запросов: 23.