Завершение работы приложения 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();
                }
            }
        }
    }

1 ответ

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

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

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

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

Другие вопросы по тегам