LINUX.ORG.RU

Qt сигналы и слоты


0

1

Возник вопрос, на который никак не могу найти однозначный ответ.

вот например, где-то в сферическом вакууме, есть цикл, который запускается, например просто нажатием на кнопку.

int d=0;
for (int i=0;i<10;++i)
{
    emit mysignal(i);
    d+=i;
}

Сигнал задан в нашем классе, так же задан слот, и всё это соедино connect'ом


void myslot(int i)
{
    DoSmth(i);
}

приложение написано с использованием минимального кода и никаких QThread мы сюда специаьно руками не добавляем.

Вопрос: При вызове слота - он будет работать в отдельном потоке не останавливая цикл for , или же они будут работать последовательно, приостанавливая друг друга ?

Вопрос: При вызове слота - он будет работать в отдельном потоке не останавливая цикл for , или же они будут работать последовательно, приостанавливая друг друга ?

приложение написано с использованием минимального кода и никаких QThread мы сюда специаьно руками не добавляем.

Ну ты понел, да?

UVV ★★★★★
()
Ответ на: комментарий от UVV

нет не понЯл

есть всякие фокусы, котоорые сбивают меня с однозначности понимания, например

oid QCoreApplication::processEvents ( QEventLoop::ProcessEventsFlags flags = QEventLoop::AllEvents ) 
qApp->processEvents();

которые позволяют приложению в одном потоке не заставлять ждать, фкус эти крайне не понятны мне.

smalldeb
() автор топика
Ответ на: нет не понЯл от smalldeb

Зависит от связи сигналов и слотов.
Если связаны напрямую - вызов слота через сигнал равносилен вызову слота как функции непосредственно в коде. Если связаны через очередь сообщений - тогда только по завершению цикла.

P.S. Для просветления читать про пятый параметр в QObject::connect и основной цикл GUI-шных программ.

trex6 ★★★★★
()

Все будет работать в потоке, в котором вызван app.exec(), т.е. «они будут работать последовательно, приостанавливая друг друга»

udp. Трекс выше дал правильное уточнение про очередь сообщений.

staseg ★★★★★
()
Последнее исправление: staseg (всего исправлений: 1)
Ответ на: комментарий от schizoid

Мультизадачность == Многозадачность ? событийная модель == основные события в Qt крутят по кругу, друг за другом ?

smalldeb
() автор топика

Обычно при вызове сигнала просто будут вызываться все соединенные слоты в том же потоке. Но, насколько я помню, если connect был сделан в одном потоке, а emit идёт из другого потока, то тогда будет кросспоточный вызов и emit продолжит своё выполнение, а тому потоку пошлётся сообщение и если он его обработает, то в этот момент вызовется метод-слот.

Вообще для понимания того, как это всё работает, рекомендую посмотреть, что творит moc с исходниками, посмотреть результат после работы препроцессора и посмотреть исходники всех интересующих функций в Qt. Мне это прояснило многие моменты, никакой магии там нет, всё на самом деле просто, до этого было недопонимание того, как это работает.

Про потоки выше написали про пятый аргумент, видимо верно, я скорее всего напутал про то, что кросс-поточный вызов идёт, если connect и emit из разных потоков.

Legioner ★★★★★
()
Последнее исправление: Legioner (всего исправлений: 1)

Там очень тупая логика, замаскированая под «ВАУ, сигналы-слоты!».

Короче, если целевой слот в том-же потоке и соединён через BlockingConnection то будет как-бы:

int d=0;
for (int i=0;i<10;++i)
{
    myslot(i);
    d+=i;
}
Если целевой слот в другом потоке или соединён через NonBlockingConnection, то будет:
int d=0;
for (int i=0;i<10;++i)
{
    // поместить вызов слота в очередь EventLoop
    d+=i;
}
// разный другой код
// возврат в EventLoop
myslot(i)
...
// и так 10 раз
// и ещё не факт что между какими-то вызовами mysqlot не вклиниться вызов какого-то другого метода

То есть, используя emit вы в принципе не можете прогнозировать как и когда будет выполнен код. Может быть сейчас, а может быть потом.

dmitryalexeeff
()
Ответ на: комментарий от dmitryalexeeff

То есть, используя emit вы в принципе не можете прогнозировать как и когда будет выполнен код.

Бред. Читать документацию до полного просветления. Там ясно сказано в каких случаях слот вызывается напрямую, а в каких — отложенно.

sjinks ★★★
()
Ответ на: нет не понЯл от smalldeb

Это не фокус, а просто проверка очереди сообщений. Позволяет приложению обрабатывать сообщения, пока оно занято. Чревато неожиданными эффектами, связанными с рекурсивным заходом в работающую функцию или изменениями данных, с которыми она работает.

unC0Rr ★★★★★
()
Ответ на: комментарий от sjinks

Всё понял, был неправ, RTFM, пойду читать маны, документацию и прочие источники мудрости...

dmitryalexeeff
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.