через веб сервер в виде json сообщений. Я использую поток и QNAM. Мне нужны были синхронные отправки сообщений, т.к. отправляется серия команд. Т.е. для одной операции команда - ответ, команда - ответ и т.д. В конце операции отправляю сигнал об успешном завершении в главный поток. Синхронность реализовал с помощью QNetworkReply, QEventLoop и таймера(таймаут).
Тут сложность появилась когда мне надо выполнять одну операцию(тоже серия команд) по таймеру раз в минуту. Т.е. проблема когда выполняются простая операция и когда срабатывает таймер раз в минуту, то из-за эвент лупа синхроности выполняется еще операция по таймеру. Как можно такое переделать и сохранить синхронность qnam ?
Можешь пояснить кто кому что отправляет?) И есть ли возможность сделать все асинхронно?( Например пронумеровать каждый запрос и в ответе отправлять номер запроса)
Программа на Qt отправляет на веб сервер кассового аппарата по локалхосту команды. На каждый запрос получаю ответ и в зависимости от ответа делают то или иное действие. Вот пример одной операции распечатки чека: 1) Открыть сессию. В ответе получаю сессионный ключ 2) Открыть чек. в ответ еще-что получаю 3) Добавить товар 4) Закрыть чек 5) Закрыть сессию Все хорошо когда пользователь в гуи сам работает с кассовым аппаратом и допустим кликает "распечатать чек", в гуи появляется защита, чтоб пока все команды не отработали, пользователь больше никаких операций не может делать. Мне понадобилось раз в минуту получать статус кассового аппарата: 1) Открыть сессию 2) Запросить статус 3) Закрыть сессию Это выполняется пару секунд. И вот думаю как это все разрулить, что пока выполняется операция статуса, пользователь может тоже начать что-то делать. На каждую команду выполнятся функция типа такой: QJsonObject send(const QJsonObject &json) { QNetworkReply *reply = mNam->post(request, QJsonDocument(json).toJson()); connect(reply, &QNetworkReply::finished, mLoop, &QEventLoop::quit); mTimeoutRequest->start(); mLoop->exec(); ... return retJson; } Просто если все делать ассинхронно, то будет очень много сигналов и слотов
Мб создать вторую сессию?
Тут явно надо асинхронно это делать
Сессия нужна как раз типа мьютекса для пользователя. Пока открыта сессия, новую нельзя открыть, будет ошибка. Это все придумали в самом кассовом аппарате
Если так, то я бы предложил: 1 отделить gui от сетевой части. 2 gui отправляет задачи в очередь 3 серверная часть смотрит в очередь и выполняет. Если сессия открыта и можно впихнуть ещё задачу- делает это.
Обсуждают сегодня