|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
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 | |
Санитар
Старожил
Регистрация: 04.10.2008
Сообщений: 2,577
|
Цитата:
|
|
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 |
Форумчанин
Регистрация: 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. |
25.10.2013, 14:25 | #5 |
Участник клуба
Регистрация: 03.12.2009
Сообщений: 1,013
|
ultimatet41
Спасибо, я знаком с этим. В своем посте я явно указал тип соединения между сигналом и слотом. Вопрос был немного в другом. Последний раз редактировалось Базиля; 25.10.2013 в 14:37. |
25.10.2013, 16:39 | #6 |
Санитар
Старожил
Регистрация: 04.10.2008
Сообщений: 2,577
|
Qt::QueuedConnection
да ты по названию то догадайся что сигналы попадают в очередь и постепенно оттуда выбираются для обработки (в цикл собственно). И что что объект был занят около минуты? - через минуту обработает следующий сигнал. Проблем то? |
25.10.2013, 16:54 | #7 |
Участник клуба
Регистрация: 03.12.2009
Сообщений: 1,013
|
Проблема была в том, что я не мог понять простого - занесением сигнала (или события) в очередь событий потока, занимается сам объект отправитель.
А я думал что этим должен был заниматься сам объект получатель |
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
написать процедуры для “Цикл 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 |