Название: Управление очередью событий Отправлено: blood_shadow от Май 13, 2011, 23:20 Можно ли как-то с помощью ф-ции типа processEvents() извлекать все события кроме
определенного слота? то есть - мне нужно получить доступ к очереди событий, извлечь из нее только нужные события, остальные "ненужные" оставить в очереди Название: Re: Управление очередью событий Отправлено: Igors от Май 14, 2011, 10:54 Такой способ мне неизвестен. Выкрутиться можно различными способами, напр поставить промежуточный слот который будет либо диспатчить сигнал конечным получателям, либо накапливать у себя (возможно потом опять посылать в очередь).
Но выглядит это все нездорово и неестественно. Если событие/сигнал столь специфичен - зачем помещать его в общую очередь? Расскажите что нужно сделать, может найдутся решения поприятнее Название: Re: Управление очередью событий Отправлено: blood_shadow от Май 14, 2011, 11:15 Такой способ мне неизвестен. Выкрутиться можно различными способами, напр поставить промежуточный слот который будет либо диспатчить сигнал конечным получателям, либо накапливать у себя (возможно потом опять посылать в очередь). та все тот же почтовый клиент..Но выглядит это все нездорово и неестественно. Если событие/сигнал столь специфичен - зачем помещать его в общую очередь? Расскажите что нужно сделать, может найдутся решения поприятнее короч ситуация такова, есть кнопка "Обновить" и кнопка "Удалить", во время загрузки писем с сервера если нажимается повторно кнопка "Обновить" перервать текущее соединение и сделать подключение заново, это обычное поведение и abort() тут делает то что надо, но есть и другая ситуация, а именно событие "Удалить" которое не должно прерываться событием "Обновить" и само не должно прерывать событие "Обновить" QEventLoop::ExcludeUserInputEvents - тут не поможет, так как подключение к серверу находится в другом потоке и начинается оно по сигналу надеюсь ясно выразился? Название: Re: Управление очередью событий Отправлено: Igors от Май 14, 2011, 11:56 надеюсь ясно выразился? Совсем неясно :) Из того что Вы рассказали я могу предположить:- прием почты происходит в отдельной нитке которая периодически вызывает processEvents. Если получен сигнал "Обновить", прием почты прерывается. Дальше - то ли нитка сама делает ре-коннект, то ли по сигналу главной (не могу знать). Ладно. - но вот каким боком здесь замешан "Удалить" и как это связано с "Обновить" - теряюсь в догадках :) Название: Re: Управление очередью событий Отправлено: blood_shadow от Май 14, 2011, 12:06 - прием почты происходит в отдельной нитке которая периодически вызывает processEvents. Если получен сигнал "Обновить", прием почты прерывается. да это правильно, слот для удаления тоже находится в той же нитке что и "Обновить"(допустим нитка №2) и он вызывается по нажатию кнопки с гуи-потока, так вот надо что при processEvents обрабатывать все события в нитке №2, но только с условием если работает слот "Обновить" то слот "Удалить" ждет в очереди событий до завершения слота "Обновить", приблизительная схема: работает слот "Обновить" - вызывается внутри него processEvents - выполняются все события кроме "Удалить" 2 ситуация работает слот "Удалить" - вызывается внутри него processEvents - выполняются все события кроме "Обновить" Название: Re: Управление очередью событий Отправлено: Igors от Май 14, 2011, 12:37 так вот надо что при processEvents обрабатывать все события в нитке №2, но Сохранить полученное событие/сигнал и после окончания Обновить/Удалить - перепослать. только с условием если работает слот "Обновить" то слот "Удалить" ждет в очереди событий до завершения слота "Обновить", приблизительная схема: работает слот "Обновить" - вызывается внутри него processEvents - выполняются все события кроме "Удалить" 2 ситуация работает слот "Удалить" - вызывается внутри него processEvents - выполняются все события кроме "Обновить" Название: Re: Управление очередью событий Отправлено: blood_shadow от Май 14, 2011, 12:57 я так понял сделать свою event queue, события "Обновить" и "Удалить" сделать QEvent'ами, слот принимающий
эти события сделать таковым: Поступает новое событие - если сокет занят(sslSocket.isOpen()) добавить в очередь, если нет - postEvent() cлот "Обновить" или "Удалить" завершается закрыть сокет имитировать сигнал про извлечение нового события в слоте извлечения нового события: проверить ли очередь не пуста, проверить сокет закрыт, если условия исполняются сделать postEvent() в слоте извлечения нового события лучше сделать postEvent() или сразу sendEvent() ? |