Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Ced от Май 21, 2017, 10:54



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


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


Название: Re: Прошу поммощи по управлению сигналами.
Отправлено: Ced от Май 21, 2017, 11:21
Спасибо, сейчас посмотрю.


Название: Re: Прошу поммощи по управлению сигналами.
Отправлено: Ced от Май 21, 2017, 11:29
Возможно Вам подойдет QQuedConnection, сигналы будут приходить только после того как текущий код выполнен и нитка ушла в событийный цикл

Что-то мой указатель в Qt 5.8 не признает наличие QQuedConnection.
Видимо речь идет о Qt::QueuedConnection?
Это похоже. Сейчас разберусь.


Название: Re: Прошу поммощи по управлению сигналами.
Отправлено: Ced от Май 21, 2017, 11:45
Да, по описанию все очень похоже. Буду тестировать. Одного не понял, а управлять этой очередью сигналов возможно? Могу ли я выкинуть из очереди часть сигналов, если она начинает нарастать и обработка не успевает?


Название: Re: Прошу поммощи по управлению сигналами.
Отправлено: Igors от Май 21, 2017, 13:12
Одного не понял, а управлять этой очередью сигналов возможно? Могу ли я выкинуть из очереди часть сигналов, если она начинает нарастать и обработка не успевает?
Нет, и это правильно, "выкидывание" ни к чему хорошему не приведет. Но Вы можете не ждать когда они придут а обработать накопившиеся (см processEvents и sendPostedEvents). Очередь хранится в QEventLoop текущей нитки


Название: Re: Прошу поммощи по управлению сигналами.
Отправлено: Old от Май 21, 2017, 13:41
Очередь хранится в QEventLoop текущей нитки
Это не совсем так. Очередь сообщений одна на каждую нить, и она хранится в структурах нити.
А QEventLoop лишь интерфейс к этой очереди.


Название: Re: Прошу поммощи по управлению сигналами.
Отправлено: Ced от Май 21, 2017, 13:43
Очередь хранится в QEventLoop текущей нитки
Это не совсем так. Очередь сообщений одна на каждую нить, и она хранится в структурах нити.
А QEventLoop лишь интерфейс к этой очереди.

Так есть средства управления этой очередью? Могу пропускать сообщения без обработки?


Название: Re: Прошу поммощи по управлению сигналами.
Отправлено: Ced от Май 21, 2017, 13:45
Нет, и это правильно, "выкидывание" ни к чему хорошему не приведет. Но Вы можете не ждать когда они придут а обработать накопившиеся (см processEvents и sendPostedEvents). Очередь хранится в QEventLoop текущей нитки

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


Название: Re: Прошу поммощи по управлению сигналами.
Отправлено: Old от Май 21, 2017, 13:47
Так есть средства управления этой очередью? Могу пропускать сообщения без обработки?
В таком виде нет.
Есть рычаг в виде QEventLoop::ProcessEventsFlags. ::)


Название: Re: Прошу поммощи по управлению сигналами.
Отправлено: Ced от Май 21, 2017, 13:55
В таком виде нет.
Есть рычаг в виде QEventLoop::ProcessEventsFlags. ::)

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


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


Название: Re: Прошу поммощи по управлению сигналами.
Отправлено: Igors от Май 21, 2017, 14:25
Обработчик живет в отдельном процессе (не в потоке).
Вы уверены? Общение слот/сигналами возможно только в рамках одного процесса (адресного пр-ва)

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



Название: Re: Прошу поммощи по управлению сигналами.
Отправлено: Old от Май 21, 2017, 14:31
Вы уверены? Общение слот/сигналами возможно только в рамках одного процесса (адресного пр-ва)
А в чем проблема? Через сигналы передаются исходные данные, а в слоте обработчике запускается внешний процесс для их обработки.


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


Название: Re: Прошу поммощи по управлению сигналами.
Отправлено: Igors от Май 21, 2017, 14:58
Это не совсем то, что нужно. Допустим, обработчик свободен. Приходит сигнал от сокета. \Обработчик берет данные и начинает обрабатывать. Если в ходе обработки придет следующий сигнал, обработку останавливать не надо, а сигнал надо просто слить. Если я Вас правильно понял, предложенный механизм работает иначе.
Не иначе, а именно так, сливает (что, повторюсь, не есть хорошо)


Название: Re: Прошу поммощи по управлению сигналами.
Отправлено: Old от Май 21, 2017, 14:59
Что-бы это работало, нужно обслуживание сокета входных данных и саму обработку разнести по разным ниткам. Тогда просто можно использовать флаг: выполняется обработки или нет. И если через сокет приходят данные на обработку в момент, когда флаг обработки установлен, то просто игнорировать их.


Название: Re: Прошу поммощи по управлению сигналами.
Отправлено: Ced от Май 21, 2017, 15:20
Что-бы это работало, нужно обслуживание сокета входных данных и саму обработку разнести по разным ниткам. Тогда просто можно использовать флаг: выполняется обработки или нет. И если через сокет приходят данные на обработку в момент, когда флаг обработки установлен, то просто игнорировать их.

Спасибо. Такой вариант мне нравится. Видимо так и поступлю.


Название: Re: Прошу поммощи по управлению сигналами.
Отправлено: Ced от Май 21, 2017, 15:29
А в чем проблема? Через сигналы передаются исходные данные, а в слоте обработчике запускается внешний процесс для их обработки.

Так делать не стал. Допускаю, что компоненты системы могут работать в сети. По этому решил обмен данными сделать через сокеты. Для обработки сокета есть отдельный универсальный модуль, который используется во всех процессах. Выделить его в нитку проблем не будет. А дальше - понятно..