Russian Qt Forum

Qt => Общие вопросы => Тема начата: sergek от Июнь 21, 2017, 08:36



Название: Сигнал и слоты - очередь событий при QueuedConnection
Отправлено: sergek от Июнь 21, 2017, 08:36
Коллеги,
всегда думал, что при QueuedConnection выполнение слотов осуществляется в порядке вызовов сигналов, например, при
Код:
    emit connectToController();	// соединиться с контроллером
    emit requestSig(rid, pars); // выполнить запрос
сначала осуществляется соединение, потом запрос. Однако, обнаружил, что может быть и наоборот. Раньше такого не замечал, столкнулся в Qt 5.8.
Существует ли соглашение о порядке организации очереди событий при соединении сигналов и слотов? Какие условия регулируют этот процесс?


Название: Re: Сигнал и слоты - очередь событий при QueuedConnection
Отправлено: __Heaven__ от Июнь 21, 2017, 09:19
Слоты в одном потоке выполняются?


Название: Re: Сигнал и слоты - очередь событий при QueuedConnection
Отправлено: sergek от Июнь 21, 2017, 09:52
Есть оба случая - и в одном потоке, и в разных. Результат одинаковый.
UPD:
Стоп. Наверное, я неправильно понял - слоты выполняются в одном потоке.
А сигналы могут испускаться из того же потока, что и слоты, и из другого.


Название: Re: Сигнал и слоты - очередь событий при QueuedConnection
Отправлено: Igors от Июнь 21, 2017, 12:06
А сигналы могут испускаться из того же потока, что и слоты, и из другого.
Здесь коварная ловушка
Код:
    emit connectToController();	// соединиться с контроллером
    emit requestSig(rid, pars); // выполнить запрос
Действительно requestSig всегда выполнится ПОСЛЕ connectToController . Однако при наличии других ниток нет гарантий что requestSig будет выполнен СЛЕДУЮЩИМ ПОСЛЕ connectToController - другие сигналы могут вклиниться между ними

Существует ли соглашение о порядке организации очереди событий при соединении сигналов и слотов? Какие условия регулируют этот процесс?
Нет, обычная очередь FIFO


Название: Re: Сигнал и слоты - очередь событий при QueuedConnection
Отправлено: sergek от Июнь 21, 2017, 12:38
Действительно requestSig всегда выполнится ПОСЛЕ connectToController . Однако при наличии других ниток нет гарантий что requestSig будет выполнен СЛЕДУЮЩИМ ПОСЛЕ connectToController - другие сигналы могут вклиниться между ними
Это не важно. Пусть не следующим за connectToController, но при fifo должен выполняться не раньше его! А у меня иногда (10-20% случаев) сначала вызывается слот запроса, а потом - слот подключения. И облом :(


Название: Re: Сигнал и слоты - очередь событий при QueuedConnection
Отправлено: Igors от Июнь 21, 2017, 13:08
Пусть не следующим за connectToController, но при fifo должен выполняться не раньше его! А у меня иногда (10-20% случаев) сначала вызывается слот запроса, а потом - слот подключения. И облом :(
Что-то не так меряете (разумеется считаем что оба сигнала испущены из одной нитки). Добавьте ID (если их еше нет) и попечатайте - не должно так быть

Это не важно.
Почти год с этим жил - нагородил логов по самые не балуйся. Летит через неск суток работы у неск юзеров. Следов нет. Ну да ладно, не важно - так не важно  :)


Название: Re: Сигнал и слоты - очередь событий при QueuedConnection
Отправлено: sergek от Июнь 21, 2017, 13:55
Что-то не так меряете (разумеется считаем что оба сигнала испущены из одной нитки). Добавьте ID (если их еше нет) и попечатайте - не должно так быть
Попробую на макете, самого гложут сомнения.