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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Управление очередью событий  (Прочитано 3141 раз)
blood_shadow
Гость
« : Май 13, 2011, 23:20 »

Можно ли как-то с помощью ф-ции типа processEvents() извлекать все события кроме
определенного слота?

то есть - мне нужно получить доступ к очереди событий, извлечь из нее только нужные
события, остальные "ненужные" оставить в очереди
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Май 14, 2011, 10:54 »

Такой способ мне неизвестен.  Выкрутиться можно различными способами, напр поставить промежуточный слот который будет либо диспатчить сигнал конечным получателям, либо накапливать у себя (возможно потом опять посылать в очередь).

Но выглядит это все нездорово и неестественно. Если событие/сигнал столь специфичен - зачем помещать его в общую очередь? Расскажите что нужно сделать, может найдутся решения поприятнее
Записан
blood_shadow
Гость
« Ответ #2 : Май 14, 2011, 11:15 »

Такой способ мне неизвестен.  Выкрутиться можно различными способами, напр поставить промежуточный слот который будет либо диспатчить сигнал конечным получателям, либо накапливать у себя (возможно потом опять посылать в очередь).

Но выглядит это все нездорово и неестественно. Если событие/сигнал столь специфичен - зачем помещать его в общую очередь? Расскажите что нужно сделать, может найдутся решения поприятнее
та все тот же почтовый клиент..
короч ситуация такова, есть кнопка "Обновить" и кнопка "Удалить", во время загрузки писем с сервера
если нажимается повторно кнопка "Обновить" перервать текущее соединение и сделать подключение
заново, это обычное поведение и abort() тут делает то что надо,
но есть и другая ситуация, а именно событие "Удалить" которое не должно прерываться событием "Обновить"
и само не должно прерывать событие "Обновить"

QEventLoop::ExcludeUserInputEvents - тут не поможет, так как подключение к серверу находится в другом потоке
и начинается оно по сигналу

надеюсь ясно выразился?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Май 14, 2011, 11:56 »

надеюсь ясно выразился?
Совсем неясно Улыбающийся Из того что Вы рассказали я могу предположить:

- прием почты происходит в отдельной нитке которая периодически вызывает processEvents. Если получен сигнал "Обновить", прием почты прерывается. Дальше - то ли нитка сама делает ре-коннект, то ли по сигналу главной (не могу знать). Ладно.

- но вот каким боком здесь замешан "Удалить" и как это связано с "Обновить" - теряюсь в догадках  Улыбающийся
Записан
blood_shadow
Гость
« Ответ #4 : Май 14, 2011, 12:06 »

- прием почты происходит в отдельной нитке которая периодически вызывает processEvents. Если получен сигнал "Обновить", прием почты прерывается.
да это правильно, слот для удаления тоже находится в той же нитке что и "Обновить"(допустим нитка №2) и он вызывается
по нажатию кнопки с гуи-потока, так вот надо что при processEvents обрабатывать все события в нитке №2, но
только с условием если работает слот "Обновить" то слот "Удалить" ждет в очереди событий до завершения слота
"Обновить", приблизительная схема:

работает слот "Обновить" - вызывается внутри него processEvents - выполняются все события кроме "Удалить"
2 ситуация
работает слот "Удалить" - вызывается внутри него processEvents - выполняются все события кроме "Обновить"
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Май 14, 2011, 12:37 »

так вот надо что при processEvents обрабатывать все события в нитке №2, но
только с условием если работает слот "Обновить" то слот "Удалить" ждет в очереди событий до завершения слота
"Обновить", приблизительная схема:

работает слот "Обновить" - вызывается внутри него processEvents - выполняются все события кроме "Удалить"
2 ситуация
работает слот "Удалить" - вызывается внутри него processEvents - выполняются все события кроме "Обновить"
Сохранить полученное событие/сигнал и после окончания Обновить/Удалить - перепослать.
Записан
blood_shadow
Гость
« Ответ #6 : Май 14, 2011, 12:57 »

я так понял сделать свою event queue, события "Обновить" и "Удалить" сделать QEvent'ами, слот принимающий
эти события сделать таковым:

Поступает новое событие -
если сокет занят(sslSocket.isOpen()) добавить в очередь, если нет - postEvent()

cлот "Обновить" или "Удалить" завершается закрыть сокет имитировать сигнал про извлечение
нового события

в слоте извлечения нового события:
проверить ли очередь не пуста, проверить сокет закрыт, если условия исполняются
сделать postEvent()

в слоте извлечения нового события лучше сделать postEvent() или сразу sendEvent() ?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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