Qt客户端应用程序在等待服务器响应期间暂停

时间:2015-08-27 09:53:03

标签: c++ qt qstatemachine qcoreapplication

问题:
如果在指定时间内没有从服务器获得响应,则使用While循环检查条件并使用计时器。

操作系统: Linux
SDK: QT 5.5

描述:

我已经实现了一个客户端,并且在代码中有while循环,它不断检查某些条件(“检查机器已启动”)是否为真。从机器服务器获取某些消息时,此条件会更改。当我实现while循环时,它会陷入其中并且不会出现。 我在这个论坛上解决了问题,有人很友好地指出了我的错误,他建议我应该使用QStateMachine,因为我的while循环正在吃掉我所有的资源。

因此,当谷歌搜索有关状态机的更多信息时,我碰到了QCoreApplication :: processEvents()。当我在我的代码中添加它时,一切都按预期工作,但计时器部分仍然超时。现在我的问题是

1)QStateMachine和QCoreApplication :: processEvents()&哪一个更好。

2)如何正确使用QTimer,以便如果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 个答案:

答案 0 :(得分:0)

timerStop( timer );应导致细分错误。 函数timerStart不会更改timer的局部变量prepareWriteToMachine(),因此该变量包含未定义的垃圾。

如果要在timer中更改外部变量timerStart,则应将指向QTimer的指针传递到该函数中:

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

顺便说一下,if( timer )中的timerStop()检查在任何情况下都没有意义,因为timer永远不会设置为零。