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