Выпуск:
Использование цикла 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();
}
}
}
}
Линия timerStop( timer );
должен вызвать ошибку сегментации.
Функция timerStart
не меняет локальную переменную timer
из prepareWriteToMachine()
, так что эта переменная содержит неопределенный мусор.
Если вы хотите изменить внешнюю переменную timer
в timerStart
Вы должны передать указатель на указатель на QTimer
в эту функцию:
void timerStart(QTimer**timer, int timeMillisecond)
{
*timer = new QTimer(this);
...
}
Кстати, проверка if( timer )
в timerStop()
не имеет смысла в любом случае, так как timer
никогда не устанавливается на ноль.