У меня есть поток диспетчера и поток прослушивателя. Когда я отправляю команду, я хочу дождаться ответа, прежде чем отправить следующую команду. Кроме того, мне нужно проверить ответ, прежде чем я смогу продолжить работу с 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 я мог использовать сигналы и слоты для подключения их каскадным образом, поэтому, когда первый сигнал запускается, он инициирует всю последовательность операций (каждый слот испускает новый сигнал), но также кажется довольно грязным.
Это управляемое событиями программирование. Это может быть чисто, если вы все сделаете правильно. – user3528438
@ user3528438 Позволяет сказать три команды, когда пользователь нажимает кнопку для выполнения чего-то. Если я подключу каждую команду к сигналу и слоту, который установит цепочку событий, это выглядит довольно громоздким. Команды имеют низкий уровень, и они более независимы. Я чувствую, что остальная часть системы должна использовать команды, команда не должна диктовать, что будет дальше !? – zar
Разделение нити диспетчера/слушателя не требуется. Его можно обрабатывать из одного потока. Вам нужен объект запроса или объект обработчика запроса, который выдает сигналы, когда доступен результат запроса. Затем это может привести к «QStateMachine», чьи состояния выдают дополнительные запросы. Части конечного автомата могут быть автоматически сгенерированы - скажем, предположим, что у вас есть список запросов на выпуск без специальной обработки между ними - вы можете создавать необходимые состояния программно. –