2015-06-19 3 views
2

У меня есть поток диспетчера и поток прослушивателя. Когда я отправляю команду, я хочу дождаться ответа, прежде чем отправить следующую команду. Кроме того, мне нужно проверить ответ, прежде чем я смогу продолжить работу с 2-й командой, наименьшая из которых - подтверждение ответа, и все в порядке. Мой псевдо-код ниже:Управление асинхронной связью: как проверить ответ, полученный в другом потоке

void MainWindow::downloadData() 
{ 
    dispatcher->getInfo(); // sends command 

    // QString response = receiver->response() // idealy I would like to check response but since its async, i can't really do that! 

    dipatcher->askData(); // the 2nd command and so forth 

} 

Есть ли элегантный способ решить эту проблему? Единственный способ, которым я могу думать, - это использовать тот же поток, и все вызовы блокируются, но это не обязательно хорошее решение.

В Qt я мог использовать сигналы и слоты для подключения их каскадным образом, поэтому, когда первый сигнал запускается, он инициирует всю последовательность операций (каждый слот испускает новый сигнал), но также кажется довольно грязным.

+0

Это управляемое событиями программирование. Это может быть чисто, если вы все сделаете правильно. – user3528438

+0

@ user3528438 Позволяет сказать три команды, когда пользователь нажимает кнопку для выполнения чего-то. Если я подключу каждую команду к сигналу и слоту, который установит цепочку событий, это выглядит довольно громоздким. Команды имеют низкий уровень, и они более независимы. Я чувствую, что остальная часть системы должна использовать команды, команда не должна диктовать, что будет дальше !? – zar

+0

Разделение нити диспетчера/слушателя не требуется. Его можно обрабатывать из одного потока. Вам нужен объект запроса или объект обработчика запроса, который выдает сигналы, когда доступен результат запроса. Затем это может привести к «QStateMachine», чьи состояния выдают дополнительные запросы. Части конечного автомата могут быть автоматически сгенерированы - скажем, предположим, что у вас есть список запросов на выпуск без специальной обработки между ними - вы можете создавать необходимые состояния программно. –

ответ

2

Одним из наиболее надежных способов обработки асинхронных событий и обработки цепей/графиков действий на этих событиях являются FSM. Qt обеспечивает основу для реализации FSM с его Qt-State machine framework. Я бы предложил пойти сюда. К сожалению, все примеры, предоставленные Qt для FSM, касаются графических интерфейсов и анимаций.

Преимущество подхода FSM заключается в том, что FSM могут быть представлены как в виде графиков, так и в виде таблиц. Первый вариант отлично подходит для понимания, второй для проверки, что нет бесконечных циклов и «мертвых» концов.

Я построил на основе собственной структуры фреймворка Qt-FSM для определения FSM на языке, специфичном для домена. Я использую его для управления сложной машиной, имеющей пару активных датчиков, работающих асинхронно. Использование DSL помогает мне реализовать более высокую абстракцию - на уровне абстракции FSM-графов.

Смежные вопросы