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

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

27 ответов

32 просмотра

зависит от способа соединения сигнала со слотом в случае диеркт вызовется немедленно, но в треде, который сигнал испустил. если это не устраивает, но хочется быстро, то есть волшебный 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
ну да, я про это

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

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

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

Портфолио: Зовут меня Александр, мне 36 лет. Город Пушкино. Общий рабочий стаж: ~14 лет Уровень квалификации: Senior Full-stack developer Где прочесть мой код? https://github....
Magic
10
Портфолио: Зовут меня Александр, мне 41 год. Город Киров. Общий рабочий стаж: ~14 лет Уровень квалификации: Senior Full-stack developer Где прочесть мой код? https://github.co...
Magic
11
Подскажите, пожалуйста, где в backende, или не в нем можно дату поправить? Логирует действия не в том часовом поясе
Лео
7
Приветствую всех, есть вопросик. Передали проект на OctoberCms, без инсталяшки в полуразвернутом виде, нужно было залить бекап бд, после залития бд, оказалось, что части строк...
Лео
14
Есть магистры regex в чате? Задача: нужно написать regex который мэтчит полные (без сокращений по типу ::1/128) ipv6 адреса кроме 2001:0df7:cef7:29f7:52f7:adf7:2cf7:4ff7, при ...
Илья
5
Всем привет В общем надо на странице вакансии вывести вакансии с hh, но когда я пишу код в разделе Code ошибка Invalid URL format. The URL should start with the forward slash...
A da
1
мне как апи hh написать?
A da
3
где собака, админ группы? нычкуется и боится проявить волю, в толерантность еще не наигрался? @yelizariev
Ognezar
61
Привет! Подскажите может кто сталкивался, при создании купона выходит вот в таком виде окно. Как поправить это?
Ruslan
4
DataGrip не сканирует почему-то все таблицы, хотя раньше показывал их че за херня, сталкивались?
Magic
9
Карта сайта