Использование цикла While для проверки состояния и использования таймера, если он не получает ответ от сервера в течение указанного времени.Закрытие клиентского приложения Qt в ожидании ответа от сервера
OS: Linux
SDK: QT 5,5
Описание:
Я implemenetd на стороне клиента и в коде есть время цикла, который бесступенчатой проверяет некоторое условие (" проверка машины началась "). Это условие изменяется, когда оно получает сообщение от машинного сервера. Когда я реализовал цикл while, он застрял в нем и не вышел. Я уволил Вопрос в этом форуме, и кто-то был достаточно любезен, чтобы указать мне свою ошибку, и он предложил мне использовать QStateMachine, поскольку мой цикл while потребляет все мои ресурсы.
Так что, при поиске в googling больше о государственной машине, я столкнулся с QCoreApplication :: processEvents(). Когда я добавил его в свой код, все работает так, как ожидалось, но часть таймера еще раз. Теперь мой вопрос:
1) В чем разница между QStateMachine и QCoreApplication :: processEvents() &, который лучше.
2) Как правильно использовать QTimer, чтобы при условии, что условие в цикле while не станет истинным в оговоренном времени, просто таймаутом и пропустите цикл while.
void timerStart(QTimer* timer, int timeMillisecond)
{
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(noRespFrmMachine())) ;
timer->start(timeMillisecond);
}
void timerStop(QTimer* timer)
{
if(timer)
{
timer->stop();
}
}
void noRespFrmMachine()
{
vecCmd.clear();
}
void prepareWriteToMachine()
{
// Some other code
// check if Machine has started we will get response in MainWindow and
// it will update isMachineStarted so we can check that
QTimer *timer ;
timerStart(timer, TIMEOUT_START); // IS THIS RIGHT??
while(isMachineStarted() == false ) // getMachineRunning-> return isMachineStarted ??
{
// do nothing wiat for machine server to send machine_started signal/msg
QCoreApplication::processEvents(); // added this one and my aplication is responsive and get correct result
}
if(isMachineStarted() == true)
{
// if we are here it mean timer has not expired & machine is runing
// now check for another command and execute
timerStop(timer);
while(vecCmd.size() > 0)
{
QString strTemp = returnFrontFrmVec();
setStoreMsgFrmCliReq(strTemp);
reconnectToServer();
}
}
}
}
Можете ли вы сделать свой isMachineStarted() в сигнал, который испускается при запуске вещи? Таким образом, не нужно будет ждать ожидание вызова processEvents(). – Archie
если я использую сигнал, он пропустит условие цикла и выполнит другие команды, которые я не хочу, если он не будет выполнен. У меня нет проблемы с процессом. Событие все, что я хочу, чтобы разделить различие между событием Qprocess и машиной QState. – samprat
Ну, QStateMachine - это реализация конечного автомата, в котором изменение состояния может быть вызвано сигналами. ProcessEvents() является частью механизмов цикла событий Qt, он отправляет ожидающие события в свои адресаты (слоты и обработчики событий). Таким образом, это две разные вещи и имеют мало общего, кроме как часть Qt-рамки. – Archie