Завершение работы приложения Qt Client во время ожидания ответа от сервера

Выпуск:
Использование цикла while для проверки состояния и использования таймера, если не получен ответ от сервера в течение указанного времени.

ОПЕРАЦИОННЫЕ СИСТЕМЫ: Linux
SDK: QT 5.5

Описание:

Я реализовал клиентскую часть, и в коде есть цикл while, который непрерывно проверяет, выполняется ли какое-то условие («проверка компьютера запущена»). Это условие изменяется, когда он получает какое-либо сообщение от сервера сервера. Когда я реализовал цикл while, он застрял в нем и не вышел.
Я запустил Вопрос на этом форуме, и кто-то был достаточно любезен, чтобы указать мне на мою ошибку, и он предложил мне использовать QStateMachine, поскольку мой цикл while потребляет все мои ресурсы.

Поэтому, прибегая к поиску конечного автомата, я наткнулся на 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();
}
}
}
}

0

Решение

Линия timerStop( timer ); должен вызвать ошибку сегментации.
Функция timerStart не меняет локальную переменную timer из prepareWriteToMachine(), так что эта переменная содержит неопределенный мусор.

Если вы хотите изменить внешнюю переменную timer в timerStart Вы должны передать указатель на указатель на QTimer в эту функцию:

void timerStart(QTimer**timer, int timeMillisecond)
{
*timer = new QTimer(this);
...
}

Кстати, проверка if( timer ) в timerStop() не имеет смысла в любом случае, так как timer никогда не устанавливается на ноль.

0

Другие решения


По вопросам рекламы [email protected]