2012-03-19 3 views
0

Я всегда использую QObject :: connect() во всех моих приложениях, но мне не ясно, какой эффект он выполняет, когда моя программа находится внутри функции. Предположим, у меня есть следующий код:Qt/C++, 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 :: подключить оставляет функцию «прекращение функции()», чтобы выполнить «ZZZ()». Что произойдет с остальными кодами в «aFunction()»

Спасибо.

ответ

0

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

Короткий ответ: в многопоточной среде, слот zzz() будет выполнен после aFunction() отделки. Фактически, сигнал, вероятно, будет испускаться после завершения функции. in multi резьба env., Такой же предмет но "через некоторое время", не после.

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

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

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

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

Нет «внезапно»

+0

Забавный я только заметил, что этот вопрос опубликован в марте. Надеюсь, OP все еще вокруг. – Evan

 Смежные вопросы

  • Нет связанных вопросов^_^