Russian Qt Forum
Ноябрь 24, 2024, 00:29 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сигнал и слоты - очередь событий при QueuedConnection  (Прочитано 7960 раз)
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« : Июнь 21, 2017, 08:36 »

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

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #1 : Июнь 21, 2017, 09:19 »

Слоты в одном потоке выполняются?
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #2 : Июнь 21, 2017, 09:52 »

Есть оба случая - и в одном потоке, и в разных. Результат одинаковый.
UPD:
Стоп. Наверное, я неправильно понял - слоты выполняются в одном потоке.
А сигналы могут испускаться из того же потока, что и слоты, и из другого.
« Последнее редактирование: Июнь 21, 2017, 10:57 от sergek » Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Июнь 21, 2017, 12:06 »

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

Существует ли соглашение о порядке организации очереди событий при соединении сигналов и слотов? Какие условия регулируют этот процесс?
Нет, обычная очередь FIFO
« Последнее редактирование: Июнь 21, 2017, 12:08 от Igors » Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #4 : Июнь 21, 2017, 12:38 »

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

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Июнь 21, 2017, 13:08 »

Пусть не следующим за connectToController, но при fifo должен выполняться не раньше его! А у меня иногда (10-20% случаев) сначала вызывается слот запроса, а потом - слот подключения. И облом Грустный
Что-то не так меряете (разумеется считаем что оба сигнала испущены из одной нитки). Добавьте ID (если их еше нет) и попечатайте - не должно так быть

Это не важно.
Почти год с этим жил - нагородил логов по самые не балуйся. Летит через неск суток работы у неск юзеров. Следов нет. Ну да ладно, не важно - так не важно  Улыбающийся
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #6 : Июнь 21, 2017, 13:55 »

Что-то не так меряете (разумеется считаем что оба сигнала испущены из одной нитки). Добавьте ID (если их еше нет) и попечатайте - не должно так быть
Попробую на макете, самого гложут сомнения.
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.066 секунд. Запросов: 23.