LINUX.ORG.RU

[Qt] сигнал-слот

 


0

1

Есть способ узнать от какого сигнала был запущен слот (узнать внутри запущенного слота) или нет.

ЗЫ: Внимание - интересно именно сигнал инициатор а не его отправитель!

Возможно, пригодится QSignalSpy

unC0Rr ★★★★★
()

А можно узнать зачем тебе это?

rival ★★
()

Обычно если хочется это знать, то архитектура косячная. Максимум должно хотеться узнать какой объект тебе сигнал послал, на это есть функция sender()

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

Единственный расово верный способ узнать, откуда вызвали тот или иной слот - прошерстить стек вызовов. В плюсах прямого пути для этого нет.

Всякие глобальные переменные в многопоточном окружении - ад

yoghurt ★★★★★
()

>Есть способ узнать от какого сигнала был запущен слот (узнать внутри запущенного слота) или нет.
нету
если не секрет, дай пример кода и объясни зачем оно тебе.

tarball
()
Ответ на: комментарий от yoghurt

>Всякие глобальные переменные в многопоточном окружении - ад

А если обернуть в thread-safe, прозрачно для пользователя?

Костыль конечно, но судя по вопросу у разрабатываемой софтины архитектура и так трещит по швам, так что одним косяком больше, одним меньше... Решение хоть лобовое, но очень простое - в этом его плюс. Главное не забыть это нормально задокументировать :)

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

Значение в эту глобальную переменную должен еще кто-то писать. Вставить соответствующий код перед каждым эмитом в своем приложении конечно можно, но вот когда сигнал придет из недр куте - тады ой.

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

Это да, либо спрятать в макросе. Мне почему-то показалось, ТС хочет свои некоторые избранные сигналы отслеживать.

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

а ты бы как сделал, быстро и без заморочек? Объясни раз умный, распиши...

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

> Я бы тупо глобальную переменную создал

Я бы тупо глобальную переменную

тупо глобальную переменную


тупо глобальную


глобальную


тупо



Выпороть.

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

>Я бы тупо глобальную переменную создал и юзал ее, без заморочек всяких.
Я бы за такую тупость тебе руки оторвал!

а ты бы как сделал, быстро и без заморочек? Объясни раз умный, распиши...

твой способ тоже не быстрый и не без заморочек.

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

>А если обернуть в thread-safe, прозрачно для пользователя?
ради весьма сомнительной фичи можно сильно потерять в производительности.

сдается мне, что задачу ТС можно решить более элегантным способом.
крайний случай - дополнительный параметр, вариант получше - callback у sender-а, еще лучше - использовать один из поведенческих паттернов и передавать объект.
но на самом деле лучше её не решать! ибо это отять-таки следствие кривой архитектуры.

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

гого, ну объясни, как без лишних телодвижений быстро замутить

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

вы изобретаете такой велосипед.. вот вы хотите сделать красиво, скока времени ушло у вас уже? вы все ни как не решите как лучше.. кому нахрен такие работники нужны. Вот я со своим стилем написания за 3 месяца годовалую работу сделал, начальник мне не нарадуется.. а вы тут херней занимаетесь, институтники!

pozitiffcat ★★★
()

И вообще... есть же setProperty, перед эмитом просто дописать что-нить вроде setProperty(«lastSignal»,SIGNAL(blablabla(blablabla)); и его уже достать через sender()->property(«lastSignal»);

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

Скажи мне, где ты работаешь, я буду держаться от этого места по-дальше.

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

>ради весьма сомнительной фичи можно сильно потерять в производительности.

Фича не сомнительная, а весьма годная подпорка для костыля. Сигналы вызываются не так часто, чтобы думать о производительности - это должно быть очевидным. Может быть не так очевидно то, что глобальные пользовательские переменные - это по сути флаги, какие-то состояния, то есть опять имеем редкие случаи обращения. В лоб интенсивный обмен данными через них будет вести только крайне упоротый первокурсник.

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

>Вот я со своим стилем написания за 3 месяца годовалую работу сделал, начальник мне не нарадуется.. а вы тут херней занимаетесь, институтники!

Справедливости ради стоит отметить, что с таким стилем написания не особо стоит рассчитывать на создание масштабируемой системы, ее дальнейшай поддержка и развитие третьими лицами опять же под вопросом.

Институтники передают пламенный привет твоему шефу :)

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

я не собираюсь делать что либо глобальное, но сеть из 90 продовольственных магазинов сидит на моей программе под линуксом.

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

Подожди. Через год начальник сменит свою точку зрения.

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

>Фича не сомнительная, а весьма годная подпорка для костыля. Сигналы вызываются не так часто, чтобы думать о производительности - это должно быть очевидным

эээ. убивание мультитрэдовости - не повод думать о производительности?
когда используешь блокировки, алгоритм по сути перестает быть параллельным. тогда использование потоков вообще теряет смысл!
(разумеется, речь идет о самом худшем случае: блокировка устанавливается в начале трэда, сбрасывается - в конце)

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

>В лоб интенсивный обмен данными через них будет вести только крайне упоротый первокурсник.
тут согласен :)
просто я изначально рассматривал как раз худший случай) привычка

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

Как такого толстотролля не закопали ещё - непонятно )

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