Russian Qt Forum
Ноябрь 24, 2024, 06:47
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Вопросы новичков
>
Прошу поммощи по управлению сигналами.
Страниц: [
1
]
2
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Прошу поммощи по управлению сигналами. (Прочитано 7055 раз)
Ced
Гость
Прошу поммощи по управлению сигналами.
«
:
Май 21, 2017, 10:54 »
Коллеги, подскажите пожалуйста, каким образом можно временно приостановить реакцию на определенный сигнал?
Мне нужно, чтобы слот, обрабатывающий поступление сигнала А, мог до завершения своей работы остановить обработку сигнала В. При этом сигнал В возможно будет приходить. Мне надо. чтобы все эти приходы становились в очередь, чтобы их все обработать после снятия запрета.
Правильно ли я понимаю, что если сделать disconnect сигнала B и соответствующего слота, а после снова connect, все так и будет?
Или слот-обработчик B потеряет все сигналы, пришедшие в момент, пока connect не действовал?
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Прошу поммощи по управлению сигналами.
«
Ответ #1 :
Май 21, 2017, 11:04 »
Цитата: Ced от Май 21, 2017, 10:54
Правильно ли я понимаю, что если сделать disconnect сигнала B и соответствующего слота, а после снова connect, все так и будет?
Или слот-обработчик B потеряет все сигналы, пришедшие в момент, пока connect не действовал?
Потеряет
Цитата: Ced от Май 21, 2017, 10:54
Коллеги, подскажите пожалуйста, каким образом можно временно приостановить реакцию на определенный сигнал?
Мне нужно, чтобы слот, обрабатывающий поступление сигнала А, мог до завершения своей работы остановить обработку сигнала В. При этом сигнал В возможно будет приходить. Мне надо. чтобы все эти приходы становились в очередь, чтобы их все обработать после снятия запрета.
Возможно Вам подойдет QQuedConnection, сигналы будут приходить только после того как текущий код выполнен и нитка ушла в событийный цикл
Записан
Ced
Гость
Re: Прошу поммощи по управлению сигналами.
«
Ответ #2 :
Май 21, 2017, 11:21 »
Спасибо, сейчас посмотрю.
Записан
Ced
Гость
Re: Прошу поммощи по управлению сигналами.
«
Ответ #3 :
Май 21, 2017, 11:29 »
Цитата: Igors от Май 21, 2017, 11:04
Возможно Вам подойдет QQuedConnection, сигналы будут приходить только после того как текущий код выполнен и нитка ушла в событийный цикл
Что-то мой указатель в Qt 5.8 не признает наличие QQuedConnection.
Видимо речь идет о Qt::QueuedConnection?
Это похоже. Сейчас разберусь.
Записан
Ced
Гость
Re: Прошу поммощи по управлению сигналами.
«
Ответ #4 :
Май 21, 2017, 11:45 »
Да, по описанию все очень похоже. Буду тестировать. Одного не понял, а управлять этой очередью сигналов возможно? Могу ли я выкинуть из очереди часть сигналов, если она начинает нарастать и обработка не успевает?
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Прошу поммощи по управлению сигналами.
«
Ответ #5 :
Май 21, 2017, 13:12 »
Цитата: Ced от Май 21, 2017, 11:45
Одного не понял, а управлять этой очередью сигналов возможно? Могу ли я выкинуть из очереди часть сигналов, если она начинает нарастать и обработка не успевает?
Нет, и это правильно, "выкидывание" ни к чему хорошему не приведет. Но Вы можете не ждать когда они придут а обработать накопившиеся (см processEvents и sendPostedEvents). Очередь хранится в QEventLoop текущей нитки
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Прошу поммощи по управлению сигналами.
«
Ответ #6 :
Май 21, 2017, 13:41 »
Цитата: Igors от Май 21, 2017, 13:12
Очередь хранится в QEventLoop текущей нитки
Это не совсем так. Очередь сообщений одна на каждую нить, и она хранится в структурах нити.
А QEventLoop лишь интерфейс к этой очереди.
Записан
Ced
Гость
Re: Прошу поммощи по управлению сигналами.
«
Ответ #7 :
Май 21, 2017, 13:43 »
Цитата: Old от Май 21, 2017, 13:41
Цитата: Igors от Май 21, 2017, 13:12
Очередь хранится в QEventLoop текущей нитки
Это не совсем так. Очередь сообщений одна на каждую нить, и она хранится в структурах нити.
А QEventLoop лишь интерфейс к этой очереди.
Так есть средства управления этой очередью? Могу пропускать сообщения без обработки?
Записан
Ced
Гость
Re: Прошу поммощи по управлению сигналами.
«
Ответ #8 :
Май 21, 2017, 13:45 »
Цитата: Igors от Май 21, 2017, 13:12
Нет, и это правильно, "выкидывание" ни к чему хорошему не приведет. Но Вы можете не ждать когда они придут а обработать накопившиеся (см processEvents и sendPostedEvents). Очередь хранится в QEventLoop текущей нитки
Реальное время подразумевает, что "Баклан, прилетающий поздно, пролетает мимо". Мне надо этот принцип реализовать, иначе очередь может расти без пределов.
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Прошу поммощи по управлению сигналами.
«
Ответ #9 :
Май 21, 2017, 13:47 »
Цитата: Ced от Май 21, 2017, 13:43
Так есть средства управления этой очередью? Могу пропускать сообщения без обработки?
В таком виде нет.
Есть рычаг в виде QEventLoop::ProcessEventsFlags.
Записан
Ced
Гость
Re: Прошу поммощи по управлению сигналами.
«
Ответ #10 :
Май 21, 2017, 13:55 »
Цитата: Old от Май 21, 2017, 13:47
В таком виде нет.
Есть рычаг в виде QEventLoop::ProcessEventsFlags.
Посмотрел. Не увидел там, как реализовать желаемый механизм. Может поясните? Мне нужно следующее: Обработчик получает сообщение. Обрабатывает данные, которые в нем приходят. Если пришло следующее сообщение того же типа, а обработчик не закончил обработку предыдущего, сообщение надо просто пропустить. Следующее сообщение будет обрабатываться тогда. когда обработка предыдущего закончена. Все, что придет в ходе обрабоки. должно быть пропущено. Обработчик живет в отдельном процессе (не в потоке).
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Прошу поммощи по управлению сигналами.
«
Ответ #11 :
Май 21, 2017, 13:58 »
Цитата: Ced от Май 21, 2017, 13:55
Посмотрел. Не увидел там, как реализовать желаемый механизм. Может поясните? Мне нужно следующее: Обработчик получает сообщение. Обрабатывает данные, которые в нем приходят. Если пришло следующее сообщение того же типа, а обработчик не закончил обработку предыдущего, сообщение надо просто пропустить. Следующее сообщение будет обрабатываться тогда. когда обработка предыдущего закончена. Все, что придет в ходе обрабоки. должно быть пропущено. Обработчик живет в отдельном процессе (не в потоке).
Я бы делал свою очередь сообщений с требуемым поведением.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Прошу поммощи по управлению сигналами.
«
Ответ #12 :
Май 21, 2017, 14:25 »
Цитата: Ced от Май 21, 2017, 13:55
Обработчик живет в отдельном процессе (не в потоке).
Вы уверены? Общение слот/сигналами возможно только в рамках одного процесса (адресного пр-ва)
Цитата: Ced от Май 21, 2017, 13:55
Посмотрел. Не увидел там, как реализовать желаемый механизм. Может поясните? Мне нужно следующее: Обработчик получает сообщение. Обрабатывает данные, которые в нем приходят. Если пришло следующее сообщение того же типа, а обработчик не закончил обработку предыдущего, сообщение надо просто пропустить. Следующее сообщение будет обрабатываться тогда. когда обработка предыдущего закончена. Все, что придет в ходе обрабоки. должно быть пропущено.
Просто в конце обработки устанавливаете флажок ignore и вызываете processEvents. Все обработчики увидев ignore немедленно возвращают управление. Однако такая схема нехороша, обычно обработчик сигналит серверу "выполнено" где сообщает рез-т операции, только тогда сервер посылает след команду
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Прошу поммощи по управлению сигналами.
«
Ответ #13 :
Май 21, 2017, 14:31 »
Цитата: Igors от Май 21, 2017, 14:25
Вы уверены? Общение слот/сигналами возможно только в рамках одного процесса (адресного пр-ва)
А в чем проблема? Через сигналы передаются исходные данные, а в слоте обработчике запускается внешний процесс для их обработки.
Записан
Ced
Гость
Re: Прошу поммощи по управлению сигналами.
«
Ответ #14 :
Май 21, 2017, 14:49 »
Цитировать
Вы уверены? Общение слот/сигналами возможно только в рамках одного процесса (адресного пр-ва)
Уверен. Сам создавал:) А работает это так:
Есть процесс-сервер. Он раздает данные обработчикам через сокеты. Когда сокет обработчика принимает сообщение от сервера, он ставит сигнал о приходе сообщения. Слот обработчика ловит сигнал, и обрабатывает сообщение.
Цитировать
Просто в конце обработки устанавливаете флажок ignore и вызываете processEvents. Все обработчики увидев ignore немедленно возвращают управление. Однако такая схема нехороша, обычно обработчик сигналит серверу "выполнено" где сообщает рез-т операции, только тогда сервер посылает след команду
Это не совсем то, что нужно. Допустим, обработчик свободен. Приходит сигнал от сокета. \Обработчик берет данные и начинает обрабатывать. Если в ходе обработки придет следующий сигнал, обработку останавливать не надо, а сигнал надо просто слить. Если я Вас правильно понял, предложенный механизм работает иначе.
Записан
Страниц: [
1
]
2
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...