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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Прошу поммощи по управлению сигналами.  (Прочитано 6661 раз)
Ced
Гость
« : Май 21, 2017, 10:54 »

Коллеги, подскажите пожалуйста, каким образом можно временно приостановить реакцию на определенный сигнал?
Мне нужно, чтобы слот, обрабатывающий поступление сигнала А, мог до завершения своей работы остановить обработку сигнала В. При этом сигнал В возможно будет приходить. Мне надо. чтобы все эти приходы становились в очередь, чтобы их все обработать после снятия запрета.
Правильно ли я понимаю, что если сделать disconnect сигнала B и соответствующего слота, а после снова connect, все так и будет?
Или слот-обработчик B потеряет все сигналы, пришедшие в момент, пока connect не действовал?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Май 21, 2017, 11:04 »

Правильно ли я понимаю, что если сделать disconnect сигнала B и соответствующего слота, а после снова connect, все так и будет?
Или слот-обработчик B потеряет все сигналы, пришедшие в момент, пока connect не действовал?
Потеряет
Коллеги, подскажите пожалуйста, каким образом можно временно приостановить реакцию на определенный сигнал?
Мне нужно, чтобы слот, обрабатывающий поступление сигнала А, мог до завершения своей работы остановить обработку сигнала В. При этом сигнал В возможно будет приходить. Мне надо. чтобы все эти приходы становились в очередь, чтобы их все обработать после снятия запрета.
Возможно Вам подойдет QQuedConnection, сигналы будут приходить только после того как текущий код выполнен и нитка ушла в событийный цикл
Записан
Ced
Гость
« Ответ #2 : Май 21, 2017, 11:21 »

Спасибо, сейчас посмотрю.
Записан
Ced
Гость
« Ответ #3 : Май 21, 2017, 11:29 »

Возможно Вам подойдет QQuedConnection, сигналы будут приходить только после того как текущий код выполнен и нитка ушла в событийный цикл

Что-то мой указатель в Qt 5.8 не признает наличие QQuedConnection.
Видимо речь идет о Qt::QueuedConnection?
Это похоже. Сейчас разберусь.
Записан
Ced
Гость
« Ответ #4 : Май 21, 2017, 11:45 »

Да, по описанию все очень похоже. Буду тестировать. Одного не понял, а управлять этой очередью сигналов возможно? Могу ли я выкинуть из очереди часть сигналов, если она начинает нарастать и обработка не успевает?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Одного не понял, а управлять этой очередью сигналов возможно? Могу ли я выкинуть из очереди часть сигналов, если она начинает нарастать и обработка не успевает?
Нет, и это правильно, "выкидывание" ни к чему хорошему не приведет. Но Вы можете не ждать когда они придут а обработать накопившиеся (см processEvents и sendPostedEvents). Очередь хранится в QEventLoop текущей нитки
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #6 : Май 21, 2017, 13:41 »

Очередь хранится в QEventLoop текущей нитки
Это не совсем так. Очередь сообщений одна на каждую нить, и она хранится в структурах нити.
А QEventLoop лишь интерфейс к этой очереди.
Записан
Ced
Гость
« Ответ #7 : Май 21, 2017, 13:43 »

Очередь хранится в QEventLoop текущей нитки
Это не совсем так. Очередь сообщений одна на каждую нить, и она хранится в структурах нити.
А QEventLoop лишь интерфейс к этой очереди.

Так есть средства управления этой очередью? Могу пропускать сообщения без обработки?
Записан
Ced
Гость
« Ответ #8 : Май 21, 2017, 13:45 »

Нет, и это правильно, "выкидывание" ни к чему хорошему не приведет. Но Вы можете не ждать когда они придут а обработать накопившиеся (см processEvents и sendPostedEvents). Очередь хранится в QEventLoop текущей нитки

Реальное время подразумевает, что "Баклан, прилетающий поздно, пролетает мимо". Мне надо этот принцип реализовать, иначе очередь может расти без пределов.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #9 : Май 21, 2017, 13:47 »

Так есть средства управления этой очередью? Могу пропускать сообщения без обработки?
В таком виде нет.
Есть рычаг в виде QEventLoop::ProcessEventsFlags. Строит глазки
Записан
Ced
Гость
« Ответ #10 : Май 21, 2017, 13:55 »

В таком виде нет.
Есть рычаг в виде QEventLoop::ProcessEventsFlags. Строит глазки

Посмотрел. Не увидел там, как реализовать желаемый механизм. Может поясните? Мне нужно следующее: Обработчик получает сообщение. Обрабатывает данные, которые в нем приходят. Если пришло следующее сообщение того же типа, а обработчик не закончил обработку предыдущего, сообщение надо просто пропустить. Следующее сообщение будет обрабатываться тогда. когда обработка предыдущего закончена. Все, что придет в ходе обрабоки. должно быть пропущено. Обработчик живет в отдельном процессе (не в потоке).
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #11 : Май 21, 2017, 13:58 »

Посмотрел. Не увидел там, как реализовать желаемый механизм. Может поясните? Мне нужно следующее: Обработчик получает сообщение. Обрабатывает данные, которые в нем приходят. Если пришло следующее сообщение того же типа, а обработчик не закончил обработку предыдущего, сообщение надо просто пропустить. Следующее сообщение будет обрабатываться тогда. когда обработка предыдущего закончена. Все, что придет в ходе обрабоки. должно быть пропущено. Обработчик живет в отдельном процессе (не в потоке).
Я бы делал свою очередь сообщений с требуемым поведением.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Обработчик живет в отдельном процессе (не в потоке).
Вы уверены? Общение слот/сигналами возможно только в рамках одного процесса (адресного пр-ва)

Посмотрел. Не увидел там, как реализовать желаемый механизм. Может поясните? Мне нужно следующее: Обработчик получает сообщение. Обрабатывает данные, которые в нем приходят. Если пришло следующее сообщение того же типа, а обработчик не закончил обработку предыдущего, сообщение надо просто пропустить. Следующее сообщение будет обрабатываться тогда. когда обработка предыдущего закончена. Все, что придет в ходе обрабоки. должно быть пропущено.
Просто в конце обработки устанавливаете флажок ignore и вызываете processEvents. Все обработчики увидев ignore немедленно возвращают управление. Однако такая схема нехороша, обычно обработчик сигналит серверу "выполнено" где сообщает рез-т операции, только тогда сервер посылает след команду

Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #13 : Май 21, 2017, 14:31 »

Вы уверены? Общение слот/сигналами возможно только в рамках одного процесса (адресного пр-ва)
А в чем проблема? Через сигналы передаются исходные данные, а в слоте обработчике запускается внешний процесс для их обработки.
Записан
Ced
Гость
« Ответ #14 : Май 21, 2017, 14:49 »

Цитировать
Вы уверены? Общение слот/сигналами возможно только в рамках одного процесса (адресного пр-ва)
Уверен. Сам создавал:) А работает это так:
Есть процесс-сервер. Он раздает данные обработчикам через сокеты. Когда сокет обработчика принимает сообщение от сервера, он ставит сигнал о приходе сообщения. Слот обработчика ловит сигнал, и обрабатывает сообщение.
Цитировать
Просто в конце обработки устанавливаете флажок ignore и вызываете processEvents. Все обработчики увидев ignore немедленно возвращают управление. Однако такая схема нехороша, обычно обработчик сигналит серверу "выполнено" где сообщает рез-т операции, только тогда сервер посылает след команду
Это не совсем то, что нужно. Допустим, обработчик свободен. Приходит сигнал от сокета. \Обработчик берет данные и начинает обрабатывать. Если в ходе обработки придет следующий сигнал, обработку останавливать не надо, а сигнал надо просто слить. Если я Вас правильно понял, предложенный механизм работает иначе.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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