Я в настоящее время (перо) проектирование системы, которая состоит из нескольких частей:Последовательный алгоритм с асинхронными событиями
- первая часть представляет собой объект, (асинхронно) получает кадры из источника и запускает событие каждым время готовности кадра – через сигнал Qt.
- Вторая часть представляет собой графический интерфейс, который показывает кадры в режиме реального времени и соединен с указанным выше сигналом слотом
- Последняя часть представляет собой процессор кадра, поведение которого лучше всего описывается последовательным алгоритмом (в то время как для, и т. д.) с возможностью реагировать на несколько видов сигнала из графического интерфейса.
Главный вопрос: если есть рекомендации по организации такого кода?
Решение, которое я придумал и не очень люблю, - это запустить 4 потока.
- графический поток, который обменивается данными с помощью сигналов Qt с 3 другими нитями
- Рама источником резьбы, который выдает сигнал на каждом наличии кадра.
- Кадровый органайзер, который хранит кадры по сигналу и использует QWaitCondition для уведомления о потоке процессора кадра.
- Поток процессорного процессора, который вызывает getNextFrame() из организатора кадра.
Но я чувствую, что это нехорошее решение, возможно, из-за смешивания различных парадигм (условий ожидания и сигналов). Кроме того, ожидание может привести к голоданию очереди обработки событий.
Я понимаю ваш ответ и содержит много полезной информации для меня. Однако мой главный вопрос заключался в том, как преобразовать управляемую событиями парадигму (события frameReady()) в последовательную обработку ('while (getNextFrame()) processFrame()'). Я столкнулся с решениями с запуском локального цикла событий ('QEventLoop') и подключением нужного сигнала (' frameReady() ') к слоту' quit() '. Однако это выглядит уродливо для меня, и, как я понял, имеет свои недостатки - может помешать нормальному ходу обработки сигнальных слотов. Извините, если я не был достаточно ясен в своей первоначальной формулировке. – fAX
Чтобы быть более конкретным, я хотел бы иметь возможность выразить алгоритм: 'frame = wait4goodFrame();/* вызывает getNextFrame() внутренне */ doSmth (frame); doSmthElse (getNextFrame()); ' вместо обработки его в слоте ' void processFrame (frame) {if (weAreWaiting4goodFrame && isGoodFrame (frame)) doSomth (frame); прочее если (weAreInStage2) doSmthElse (рамка); else if ...} ' Это менее читаемо и имеет огромный шаблонный код. – fAX
Преобразование событий в последовательную обработку - это именно то, что вы * не * должны делать. Читабельность/шаблонная таблица минимальны, если ваш код не является тривиальным. 'If (weAreWaiting4goodFrame ...' означает, что вы хотите конечный автомат, которые лучше всего выражаются непосредственно в повторной реализации 'void customEvent (QEvent *)'. Для элементарного FSM просто отправьте указатель метода и получите один метод для каждого состояния. Это способ правильно спроектировать его. Механизм состояний Mangling в последовательной обработке работает только с самого начала. Когда вы начинаете обрабатывать восстановление ошибок и т. д., код становится спагетти. –