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