Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.10.2013, 01:36   #1
Базиля
Участник клуба
 
Аватар для Базиля
 
Регистрация: 03.12.2009
Сообщений: 1,013
Печаль QT - цикл обработки событий.

Всем доброй ночи!

Назрел такой вопрос, а точнее есть недопонимание одного момента.

Допустим, что имеется 2 потока, у каждого из них по своему циклу обработки событий.
Потоки обмениваются информацией с помощью сигналов и слотов. Соответственно сигнал при поступлении к объекту получателю, преобразуется в событие и встает в очередь обработки событий данного объекта.

Не совсем понятно, что произойдет с сигналом, если в данный момент объект получатель занят. Куда денется сигнал? (а точнее быть событие).
В какую именно очередь событий он тогда встанет?
А если за этим сигналом поступает следующий сигнал?
У меня есть свое некое абстрактное понятие по этому вопросу, но хотелось бы более прояснить для себя всю картину.

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

Просмотрел всю документацию и книги по данному вопросу, почему-то именно этот момент не рассматривается.
Остается только как-то домысливать самому, но что-то видать не совсем это правильно получается.

Спасибо!

Последний раз редактировалось Базиля; 25.10.2013 в 01:40.
Базиля вне форума Ответить с цитированием
Старый 25.10.2013, 09:08   #2
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,618
По умолчанию

Цитата:
К примеру, если объект получатель был долгое время недоступен (занимался вычислениями или просто "спал"), то из всех поступающих в этот момент сигналов (их было около 300) - пропало 30. Т.е. они просто не дошли до объекта получателя, с чем это может быть связано?
Что-то нереальное, напиши пример кода в котором это наблюдается.
rrrFer вне форума Ответить с цитированием
Старый 25.10.2013, 12:21   #3
Базиля
Участник клуба
 
Аватар для Базиля
 
Регистрация: 03.12.2009
Сообщений: 1,013
По умолчанию

Извиняюсь, после ряда тестов, я выяснил, что проблема, кажется, кроется в другом куске кода.
Сейчас разберусь с ним, а после отпишусь

rrrFer
Но вот все-таки, так и не понимаю один момент.
Если объект получатель был занят около минуты, то как он получит в конечном итоге сигнал?
Объект отправитель испустил сигнал - все, его ведь больше ничего не беспокоит, дошел там сигнал или нет, ему все равно (QueuedConnection).
Сам цикл обработки ведь крутится в самом объекте, верно? (но это должно быть не так, иначе я вообще представить себе не могу этот механизм передачи ).

На практике - все работает, но как это все обстоит до конца, очень хочется понять.
P.S. Почему в книгах этот вопрос не рассматривается до конца, на самом деле ведь очень важный момент

Последний раз редактировалось Базиля; 25.10.2013 в 12:26.
Базиля вне форума Ответить с цитированием
Старый 25.10.2013, 14:21   #4
ultimatet41
Форумчанин
 
Аватар для ultimatet41
 
Регистрация: 08.04.2012
Сообщений: 104
По умолчанию

В методе connect можно указать тип соединения:
QObject::connect (QObject *sender, char *signal, QObject *receiver, char *slot, Qt::ConnectionType type = Qt::AutoConnection)

В частности, тип соединения определяет будет ли сигнал доставлен немедленно, либо поставлен в очередь.
Типы соединений:
Qt::DirectConnection - при генерации слот получает сигнал незамедлительно.
Qt::QueuedConnection - при генерации сигнал помещается в очередь обработки событий.
Qt::BlockingQueuedConnection - при генерации сигнал помещается в очередь обработки событий. Пока слот не получит сигнал текущий поток блокируется. Данный тип соединения следует применять только для получателя в другом потоке.3
Qt::AutoConnection - если отправитель и получатель находятся в одном потоке, то будет использован Qt::DirectConnection, иначе используется Qt::QueuedConnection.
ultimatet41 вне форума Ответить с цитированием
Старый 25.10.2013, 14:25   #5
Базиля
Участник клуба
 
Аватар для Базиля
 
Регистрация: 03.12.2009
Сообщений: 1,013
По умолчанию

ultimatet41
Спасибо, я знаком с этим.
В своем посте я явно указал тип соединения между сигналом и слотом.
Вопрос был немного в другом.

Последний раз редактировалось Базиля; 25.10.2013 в 14:37.
Базиля вне форума Ответить с цитированием
Старый 25.10.2013, 16:39   #6
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,618
По умолчанию

Qt::QueuedConnection
да ты по названию то догадайся что сигналы попадают в очередь и постепенно оттуда выбираются для обработки (в цикл собственно).
И что что объект был занят около минуты? - через минуту обработает следующий сигнал. Проблем то?
rrrFer вне форума Ответить с цитированием
Старый 25.10.2013, 16:54   #7
Базиля
Участник клуба
 
Аватар для Базиля
 
Регистрация: 03.12.2009
Сообщений: 1,013
По умолчанию

Проблема была в том, что я не мог понять простого - занесением сигнала (или события) в очередь событий потока, занимается сам объект отправитель.
А я думал что этим должен был заниматься сам объект получатель
Базиля вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
написать процедуры для “Цикл For ... Next ” и «Цикл Do ... Loop» по ниже приведенному условию Кристина_Патачиц Microsoft Office Excel 3 17.04.2013 17:01
Модели обработки событий Java-приложений java_java_java Общие вопросы по Java, Java SE, Kotlin 1 10.07.2009 12:00
Инициализировать класс, например, для обработки событий с OLE CaptainNemo Microsoft Office Excel 1 15.06.2009 06:21
Цикл с предусловием. ( цикл while) Цикл с постусловием. (цикл repeat ... until) Mr.User Помощь студентам 9 23.11.2007 01:34