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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Очистка и прочее управление очередями  (Прочитано 11346 раз)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« : Декабрь 08, 2014, 11:13 »

Известно, что у Qt по необъяснимым причинам нет никакого управления очередями при соответствующих соединениях сигнал/слот. Очередь нельзя принудительно очистить, нельзя управлять её длиной, нельзя её "сливать" (игнорировать выход, если она никуда не подключена). Я искал объяснения, но ничего вменяемого не нашёл.

Есть желающие обсудить этот вопрос? Мне лично потребовалась необходимость очистки очереди и управления её длиной. Может стоит feature request написать? Или этот вопрос уже ранее поднимался (я с версии Qt 3.3 такого не помню, может прозевал)?
Записан

2^7-1 == 127, задумайтесь...
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Декабрь 08, 2014, 11:16 »

Для чего тебе понадобилась такая возможность? Скорее всего, можно проблему решить по-другому.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #2 : Декабрь 08, 2014, 11:28 »

Для чего тебе понадобилась такая возможность? Скорее всего, можно проблему решить по-другому.

Для того, что в задаче нити общаются через очереди, а соединения между нитями могут динамически меняться, вплоть до отключения.  Надо иметь возможность очистки оторванной очереди и ограничения длины, чтобы нить при достижении очередью определенной длины останавливалась (как в случае QBlockingQueued). По-другому нормально - никак. А очереди в Qt - не объекты, во всяком случае, их структура снаружи не видна, их нельзя унаследовать и написать поверх них свой функционал.
Записан

2^7-1 == 127, задумайтесь...
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #3 : Декабрь 08, 2014, 11:46 »

Пришло время использовать свои очереди.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #4 : Декабрь 08, 2014, 11:56 »

Да, свои очереди делай.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Декабрь 08, 2014, 12:38 »

Известно, что у Qt по необъяснимым причинам нет никакого управления очередями при соответствующих соединениях сигнал/слот. Очередь нельзя принудительно очистить, нельзя управлять её длиной, нельзя её "сливать" (игнорировать выход, если она никуда не подключена). Я искал объяснения, но ничего вменяемого не нашёл.
Это не совсем так. Есть метод compressEvent (правда не документированный)

Есть желающие обсудить этот вопрос? Мне лично потребовалась необходимость очистки очереди и управления её длиной. Может стоит feature request написать? Или этот вопрос уже ранее поднимался (я с версии Qt 3.3 такого не помню, может прозевал)?
Написание feature request - это как бы "жест доброй воли" или благотворительность. Возможно через годик Вы с удовольствием заметите "ага, молодцы, сделали!", но может и нет, им ведь тоже надо "поднимать проект". Во всяком случае надеяться решить свои проблемы с помощью feature request не стоит.

Я бы сначала поизучал compressEvent, сделал бы нужные операции с очередью как "тоже событие". Это просто предложение, оценивать типа "а вот это уже чепуха" не надо Улыбающийся  Может и чепуха, может и нет.

Записан
Bepec
Гость
« Ответ #6 : Декабрь 08, 2014, 13:09 »

Механизм сигнал слот в Qt отлажен и подходит под 99% нужд, не заставляя даже задумываться о том, как оно работает. А у вас задача как раз в 1% попадает, в котором вам надо изменить механизм.
И если допустим они возьмутся за реализацию управления всем этим, то придётся весь механизм переписывать. Сейчас он прост и не вызывает затруднений именно тем, что хрен кто в него влезет Веселый

PS моё мнение - проще вам свою очередь написать.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #7 : Декабрь 08, 2014, 18:38 »

Свою очередь - однозначно не проще. Там всё по затылок в сигналах-слотах, а это означало бы написать их и большую часть приложения.

Причем 100% все нужные механизмы наверняка в очередях есть, иначе они бы вообще не работали. Просто наружу не вытащено.

Не вижу пока, как compressEvent может помочь хотя бы очистить очередь.
Записан

2^7-1 == 127, задумайтесь...
Bepec
Гость
« Ответ #8 : Декабрь 08, 2014, 18:50 »

Всё там есть, и очистка, и получение количества сигналов, и многое другое. Вот ток оно внутри. Коммерческую лицензию и флаг в руки.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Декабрь 08, 2014, 19:09 »

Не вижу пока, как compressEvent может помочь хотя бы очистить очередь.
Да хотя бы так
Код
C++ (Qt)
bool MyApplication::compressEvent(QEvent *event, QObject *receiver, QPostEventList *postedEvents)
{
   if (event->type() == myClearAll) {
     postedEvents->clear();
     return true;
   }
   return QGuiApplication::compressEvent(event, receiver, postedEvents);
}
Только вряд ли это нужно/разумно делать

Свою очередь - однозначно не проще. Там всё по затылок в сигналах-слотах, а это означало бы написать их и большую часть приложения.
Категоричные суждения обычно поверхностны. Своя очередь практически неизбежна. Обычно она имеет высший приоритет (т.е. сначала выбираются все события из "своей" очереди, напр в eventFilter). Смешивать очереди не резон. Засылать события в свою очередь можно хоть напрямую, хоть с подскоком из того же compressEvent

Всё там есть, и очистка, и получение количества сигналов, и многое другое. Вот ток оно внутри. Коммерческую лицензию и флаг в руки.
Ну вот после таких ответов нервный ТС блокирует тему  Улыбающийся
Цитировать
Суп на пароходе - прямо из Парижв! Открываешь кастрюльку - а там паааар..
Улыбающийся
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #10 : Декабрь 08, 2014, 19:24 »

Увы, свою очередь делать не с руки, придётся весь механизм сигнал-слотов дублировать, потому что на него эта часть приложения полностью опирается. Общение между параллельными нитями сделано на сигналах и слотах, нити в плагинах, связывание сигналов и слотов автоматическое при загрузке плагинов, всё спроектировано, и в основном отлажено. А перепахивать приложение сейчас уже нет времени. На коммерческую лицензию сейчас денег никто не даст. А значит самый простой вариант - feature request, авось исполнится.
Записан

2^7-1 == 127, задумайтесь...
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #11 : Декабрь 08, 2014, 19:28 »

А значит самый простой вариант - feature request, авось исполнится.
Еще можно свечу в церкви поставить, может помочь. Подмигивающий
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Декабрь 08, 2014, 20:07 »

Увы, свою очередь делать не с руки, придётся весь механизм сигнал-слотов дублировать, потому что ..
Чего это дублировать? Очереди "рабочих ниток" - что в них может быть кроме сигналов посланных из др ниток? По-моему аж ничего. Значит с ними можно напрямую. С главной ниткой так вряд ли прокатит, ну так если Вы собрались сливать/удалять - значит знаете что, т.е. интересующие события/получатели известны. Что мешает их выделить их отдельно? Выполнять их первыми - не проблема
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #13 : Декабрь 08, 2014, 20:22 »

Очереди "рабочих ниток" - что в них может быть кроме сигналов посланных из др ниток? По-моему аж ничего.

Ну например, у меня с нитками через стандартные сигнал-слоты весь интерфейс общается. Которого не мало. Да и вообще вся главная нить. И пользователь может через этот интерфейс динамически подключать и отключать сигналы, даже во время выполнения нитей. Сейчас это всё без проблем работает на базовых сигналах. На своих - придется написать их фактически эквивалент, и еще не вполне понятно, как он должен взаимодействовать с базовыми сигналами. Именно с сигналами, это у меня основной механизм обмена. Всё приложение прошито соединениями, как мозг млекопитающего синапсами. События (Events) я в своем приложении вообще не создаю и не использую, и не собираюсь - только обрабатываю всякие интерфейсные, которые сам Qt посылает, по необходимости.
Записан

2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #14 : Декабрь 08, 2014, 20:27 »

Не, писать свои очереди я пока не буду. А вот запрос на фичу уже написал.  Смеющийся

Кстати, вспомнил - где-то еще в версии Qt 2.х, когда я с ним только знакомился, в его тусовке горячо обсуждался вопрос управления очередями. Противники говорили, что это нарушает принцип объектности и идеологию Qt, якобы дает возможность вмешательства в святыни. Сторонники говорили, что не будет нарушений, если очередью сможет управлять только тот, кто в неё посылает, этого будет достаточно. AFAIR тогда сказали, что это обсуждение будет продолжено в версии 3.х. Там, судя по всему, про это всё забыли. Но тогда еще не так горячо требовалась поддержка распараллеливания. Сейчас требуется. У меня в некоторые моменты времени работают 8 нитей одновременно, и это еще только середина разработки...
Записан

2^7-1 == 127, задумайтесь...
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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