Qt / C ++, QObject :: connect () влияет на выполняемую в данный момент функцию? - PullRequest
0 голосов
/ 19 марта 2012

Я всегда использую QObject :: connect () во всех моих приложениях, но мне неясно, когда моя программа находится внутри функции. Предположим, у меня есть следующий код:

void main() {
    //other stuffs here
    QObject::connect(xxx,SIGNAL(yyy()),this,SLOT(zzz());
}

void aFunction()
{
    //a bunch of codes here

    //i am here when suddenly signal is emitted from QObject::connect();

    //another bunch of codes here
}

Я предполагаю, что когда излучается сигнал, QObject :: connect оставляет функцию "aFunction ()" для выполнения "zzz ()". Что будет с оставшимися кодами в "aFunction ()"

Спасибо.

1 Ответ

0 голосов
/ 22 июля 2012

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

Краткий ответ: в не многопоточной среде слот zzz() будет выполнен после завершения aFunction(). Фактически, сигнал, вероятно, испускается после завершения функции. в многопоточной среде, то же самое, но это «через некоторое время» , а не после.

Ключ к пониманию этого - Event Loop. QApplication::exec() запускает бесконечный цикл для события. Новое событие затем обрабатывается, сигналы испускаются и в зависимости от пятого аргумента QObject::connect, который является Qt::ConnectionType, в конечном итоге запускает подключенный слот. Вы можете прочитать документацию QObject для более подробной информации.

Таким образом, ваш aFunction, вероятно, будет вызван после некоторого сигнала, поэтому после его завершения он снова возвращается в цикл обработки событий, затем ваш 'внезапно испущенный' сигнал фактически испускается, и zzz выполняется.

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

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

нет "внезапно"

...