执行QTimer一次,逻辑失败,同时循环Qt

时间:2015-08-26 18:09:10

标签: c++ qt

OS:Linux
SDK:Qt
小部件 - > 2 QLineEdits说(lEditSndRequest)&在mainQwidget窗口中的lEditGetResponse

QTCPSocketClient实现为mainQwidget窗口的子代。

概述:
  用户向serverMachine发送请求并获得响应。请求首先显示在lEditSndRequest中。 lEditSndRequest将该请求转发给客户端部分,使用Qt库写入Server。所有工作正常。  服务器还向客户端发送响应。它转到客户端部分说func getResponseFrmMachine。从该函数发出的更新lEditGetResponse的信号。当它更新LEditGetResponse时,当调用slot表示getCliRespTextChanged()时会发出textChangeSignal。 此广告位更新了另一个membervaribale" isMachineStarted"是真还是假。

假设我们收到来自机器的响应,例如" machine_started"它会将bool成员变量更新为true。

问题:

用户发送命令,如" make_machine_move" 。但是之前客户端代码可以将该命令发送到服务器,我需要发送命令,如" start_machine_first" 。我使用vector来存储两个命令

Alos我有一个函数说returnFrontFrmVec();它返回vector中的第一个元素,然后从vec中删除它。  我将该向量传递给实际写入服务器的函数。它在那里我的逻辑失败了。 我想要的是如果矢量大小> 1(表示有2个命令)然后使用" machine_started"提取前部和comapre。如果为true,则在执行另一个命令之前发送machine_started命令并等待响应。机器可能需要2分钟才能启动。所以,如果计时器到期(在这种情况下,清除向量,因为机器尚未启动,并且没有用于发送移动命令)或等到我们收到响应。前面提到的响应是lEditGetRespone和slot,它将更新bool varibale" isMachineStarted"为真。所以我正在检查它。

输出
服务器没有收到消息,并且从不调用connectedToMachine()槽。应用程序停留在While循环中。

void prepareWriteToMachine()
{
  int sizeOfVec = noOfElemInVecCmd();

  if( sizeOfVec  == 1 ) // there are no other command so just execute teh first command from vector
    {
      QString strTemp = returnFrontFrmVec();
      // place temp str in storeLineEditMsg to be used by connectedtoMachine
      setStoreMsgFrmCliReq( strTemp );
      reconnectToServer(); // this will emit SIGNAL connected() which inturn calls slot connectedToMachine( ) 
    }
  if( sizeOfVec > 1 )
    {
      QString strTemp = returnFrontFrmVec();
      if( strTemp == CMD_STRT)// send it and wait for response
        {
          setStoreMsgFrmCliReq( strTemp );
          reconnectToServer();// this will emit SIGNAL connected() which inturn calls slot connectedToMachine( ) // But nver get called
        }
      // Now 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 );
      while( isMachineStarted() == false  )  // getMachineRunning-> return isMachineStarted ??
        {
          // do nothing wiat for machine to send machine_started
        }
      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();
            }
        }
    }
}


void connectedToMachine( )  
{
  // if we reach here then client is connected to server ..
  //send signal to update connecting status in Qlineedit


  QByteArray block;
  QDataStream out( &block, QIODevice::WriteOnly );

  out.setVersion( QDataStream::Qt_4_3 );
  out << quint16( 0 ) << getStoreMsgFrmCliReq();
  out.device()->seek( 0 );
  out << quint16( block.size() - sizeof( quint16 ) );

  sockForMachine->write( block );
  //reset storeLineEditMessage
  storeLineEditMsg.clear();
}

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();
}

QString returnFrontFrmVec( )
{
  QString frntCmd;
  if( ! vecCmd.empty() )
    {
      frntCmd = vecCmd.front();
      vecCmd.erase( vecCmd.begin() );// retrieve and now delete first element
    }
  return frntCmd;
}

bool isMachineStarted()( )const
{

  return isMachineStarted;
}
void setMachineStarted( bool isRun )
{

isMachineStarted = isRun;
}

0 个答案:

没有答案