Если у меня к примеру в длинной портянке функции из

100 строк где-то в первых строках высылается сигнал emit signal(), то когда в рантайме его получит обработчик этого сигнала, относительно выполнения самого emit? То бишь сигнал выслан в первых строках функции или метода по ходу выполнения, то не будет ли он обработан только тогда, когда в этой функции будут выполнены все строки кода?

27 ответов

80 просмотров

зависит от способа соединения сигнала со слотом в случае диеркт вызовется немедленно, но в треде, который сигнал испустил. если это не устраивает, но хочется быстро, то есть волшебный QApplication::processEvents, который немедленно попросит евентлуп обработать очередь сообщений

Александр-G Автор вопроса
Angry Subst
зависит от способа соединения сигнала со слотом в ...

А если слот-обработчик в другом потоке вызывается?

Александр G
А если слот-обработчик в другом потоке вызывается?

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

https://doc.qt.io/qt-6/qt.html#ConnectionType-enum

зависит от типа соединения. но мне кажется плохая практика завязываться на то когда обработается сигнал. ты эмитишь сигнал и не знаешь когда он обработается, может и не обработается вообще

Александр-G Автор вопроса
mefest
зависит от типа соединения. но мне кажется плохая ...

Да я вот не знаю, как это реализовать не костыльно: мне нужно отправить из одного объекта сигнал в другой объект, и тут же получить результат выполнения обработки этого сигнала.

Александр G
Да я вот не знаю, как это реализовать не костыльно...

тут кажется только через сигнал от другого объекта. сигнал\слоты не для последовательного выполнения кода

Александр G
Да я вот не знаю, как это реализовать не костыльно...

Кажется легко такое можно реализовать в Qt6 с помощью QtConcurrent и then. В then передать контекст объекта, и функция. Функция будет выполняться в треде где находится сам объект. Несколько then и все будет последовательно. Но выглядеть будет костыльно

Слот будет вызван НЕПОСРЕДСТВЕННО в этой строчке, где emit . Но есть нюансы. Связывание сигналов и слотов имеет параметр - тип связи, есть связи с отложенным исполнением и из другого потока. Если связи такого рода, то момент вызова не определён.

Александр-G Автор вопроса
Ilya Zviagin
Слот будет вызван НЕПОСРЕДСТВЕННО в этой строчке, ...

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

Angry Subst
что значит слот-обработчик в другом потоке вызывае...

Ну при этом ещё и ошибка будет, что ты direct связал сигнал и слот разных потоков

Александр G
Да я вот не знаю, как это реализовать не костыльно...

Результат также при Direct connection возвращается непосредственно. Но только у слотов нет выходных данных, на сколько я помню

Ilya Zviagin
Ну при этом ещё и ошибка будет, что ты direct связ...

откуда такая уверенность? 😜 ошибки не будет связать имеешь право, если точно знаешь, что делаешь. То что авто делает именно так означает только то, что так наиболее безопасно, не более. class ChildThread { .... } class MainThread { .... childThread=new ChildThread(..); connect(this,&MainThread::signal,childThread,&ChildThread::slot, Qt::DirectConnection); } тут emit siagnl(..) из mainThread по сути эквивалентен прямому вызову childThread->slot() и в чем тут ошибка?

Angry Subst
откуда такая уверенность? 😜 ошибки не будет связат...

В рантайме ошибка будет. Ну, QAcssert и далее в зависимости от настроек

Александр-G Автор вопроса
Ilya Zviagin
Результат также при Direct connection возвращаетс...

вообще да, слот всегда void возвращает, поэтому видимо только моим способом

Вообще, это называется просто "вызов функции"

Александр-G Автор вопроса
Ilya Zviagin
Вообще, это называется просто "вызов функции"

Ну вообще все в программировании построено на вызовах функций) но я не могу взять и вызвать функцию из другого потока напрямую, причём такую функцию, которая внутри своего выполнения выполняет connect () для reply, который ожидает ввод/вывод

Александр G
Ну вообще все в программировании построено на вызо...

Можно подробней что вам нужно сделать? Вот есть GUI поток основной и поток игровой логики. Вам нужно нажать условную кнопку и выполнить действие которое включает получение результата метода из объекта который в потоке игровой логики? и чтобы GUI Не завис? Я ничего не упустил?

Александр-G Автор вопроса
Ilya Zviagin
почему вдруг из другого потока-то ?

сообщением выше я раскрываю весь вопрос)

Ilya Zviagin
В рантайме ошибка будет. Ну, QAcssert и далее в за...

ошибка в рантайм будет только в том случае, если определенные операции ты попробуешь сотворить в этом слоте над объектами, которые были созданные в child потоке есть то, чего делать нельзя. Например из другого потока ты не можешь убить объект, созданный в другом. но, ты запросто можешь делать иные вещи. Объви членом класса ChildThread переменную типа, ну QString и поменяй в этом слоте ее значение... и покажи как и что упадет emit signal TMainWnd(0x6336bff440, name="TMainWnd") slot TPrinterWorker(0x1d6524bd0d0) private boolean variable value before: false slot TPrinterWorker(0x1d6524bd0d0) private boolean variable value after: true

Ilya Zviagin
ну да, я про это

что про это? никакой ошибки, все штатно и работает дальше... это я в дебуг сообщения выкинул, коннект директовый

Похожие вопросы

Обсуждают сегодня

Добрый вечер, Пока не совсем понимаю как наладить общение между телеграм ботом и ПО для работы с сим боксом. По самому боту так понял: - Нужен некий баланс, который можно поп...
Magic
6
сделал сайт, прикрутил в боте сайт, и виджет логина. как автоматически логинить пользователя в аккаунт(телеграм), при входе с бота?
Александра Чернивецкая
5
Объясните, пожалуйста, почему компилятор ругается на использование в условии неинициализированной переменной: int x; Task.Run(async () => { x = await somefunc(); }).Wait...
Александр
5
Ребят, подскажите, пожалуйста, почему в префиксе к ассетам, которые генерируются через фильтр | theme в шаблоне, стал вдруг появляться index.php? Вот так выглядит ссылка на а...
Виталий
1
Всем привет. Ребята, подскажите, пожалуйста. у ботов есть ограничение на отправку сообщений - 30 сообщений в секунду, эти ограничения накладываются на все сообщения? или на со...
Artem Stormageddon
4
Блин, ребята, сори за тупые вопросы. А можно ли как-то открыть вебапку по нажатию на кнопку в меню(которое появляется слева, команды)?
Artem Stormageddon
3
а плаксы из-под питона умеют только в комфортных условиях что-то выдавить из себя?)
Lencore
9
Но, может, есть уже проверенная? Наши требования такие: 1. Сообщения должны приходить из Инста в CRM оду 2. Должна быть возможность подключить несколько экаунтов Инстаграм. Р...
Alexander Sharoiko MSE / Александр Шаройко
13
Это может быть все-таки не флудвейт? у меня ботфазер принимает изменения и отображает даже что они изменились, на видео видно что он прислал якобы уже измененное описание, н...
OVERLINK
13
Коллеги, может знает кто, можно ли цвет бейджа счётчика в BackendMenu менять без бубнов?
Alex Blaze
3
Карта сайта