Я могу понять путаницу, переход от процедурного к основанному на событиях программированию дает мне тот же опыт, что и вы сейчас.
Краткий ответ:
в не многопоточной среде слот zzz()
будет выполнен после завершения aFunction()
. Фактически, сигнал, вероятно, испускается после завершения функции.
в многопоточной среде, то же самое, но это «через некоторое время» , а не после.
Ключ к пониманию этого - Event Loop. QApplication::exec()
запускает бесконечный цикл для события. Новое событие затем обрабатывается, сигналы испускаются и в зависимости от пятого аргумента QObject::connect
, который является Qt::ConnectionType
, в конечном итоге запускает подключенный слот. Вы можете прочитать документацию QObject для более подробной информации.
Таким образом, ваш aFunction
, вероятно, будет вызван после некоторого сигнала, поэтому после его завершения он снова возвращается в цикл обработки событий, затем ваш 'внезапно испущенный' сигнал фактически испускается, и zzz
выполняется.
Даже в многопоточной среде сигналы и слоты между потоками работают с Qt::QueuedConnection
, который в основном просто отправляет излучаемый сигнал в соответствующий поток, так что, когда цикл обработки событий этого потока приходит в себя для его обработки, он также будет выполняться последовательно.
В конечном итоге вам нужно помнить, что эта машина Тьюринга, называемая компьютерами, выполняет последовательностей кодов, будь то полупараллельный (например, разделение времени, конвейерная обработка) или истинно параллельный (например, многоядерный, многоядерный процессор). ) часть, в которой коды отправляются (или распространяются? или выбираются?) для его выполнения, всегда будет выполняться последовательно или одним или несколькими способами должны быть смоделированы, чтобы быть последовательными, чтобы ни один код не выполнялся дважды в нескольких узлах выполнения.
нет "внезапно"