如何在不冻结Qt中的GUI的情况下等待Qtcpsocket数据?

时间:2015-07-16 15:31:56

标签: c++ qt user-interface qtcpsocket

我已经实现了** QTcpserver **。在与客户端(PLC)成功连接后,两者都以双向握手方式交换数据。表示服务器发送带有计数器值的数据,客户端将使用相同的值进行回复,当服务器收到它发送的值,并增加计数器值。这继续循环。我已经完成了使用信号和插槽。 connect(m_tcpSocket, SIGNAL(readyRead()),this, SLOT(socketReadyRead())); 在socketReadyRead()的插槽中,我向数据发送槽connect(this,SIGNAL(newRawData()),this,SLOT(sendRawData()));发出信号,在那里我发送带有递增计数器值的新数据。注意几乎每30ms调用一次sendRawData()。

    void TCPCommunicationPort::socketReadyRead()
    {
        emit newRawData();//connect to another slot where i send data
        //    qDebug()<<"bytes available "<<m_tcpSocket->bytesAvailable();
        QByteArray receivedData = m_tcpSocket->readAll();
        //I am updating the GUI written in QML through signals  
        emit sendDatatoQml(byteIndex,-1,overrideValue);
        //....
    }

现在,我发送48Bytes数据,并从客户端收到 68字节**的数据。执行称为归位的功能。我需要设置/启用48字节sendData中的特定位(比如第6字节的第1位和第2位)并等到68字节中的特定位(接收数据)(比如第10字节的第3位)为真(这将是在几个之后)然后我禁用了第6个字节的第1位和第2位。同时,服务器必须继续以递增的计数器值发送** 48字节的数据,否则它将断开连接。怎么穿这个等待?请注意,已经有数据在循环中进行交换。

我试过这样但是Qt的创建者和应用程序都因为infinet while循环而被冻结和崩溃(取消注释它)。如果我删除while循环它不会进入If语句。我必须等待那个If语句。

    void TCPCommunicationPort::startHoming()
    {
        if(!(m_senddataBuffer[CREG1] & (1 << EMSTOP)))
          {
            m_senddataBuffer[CREG1] |= 1<<EMSTOP;
            bool bitvalue = (m_senddataBuffer[CREG1] & (1 << EMSTOP));
            dataFromCppUpdate(CREG1,EMSTOP,bitvalue);
          }
        if(!(m_senddataBuffer[CREG1] & (1 << MSTOP)))
          {
            m_senddataBuffer[CREG1] |= 1<<MSTOP;
            bool bitvalue = (m_senddataBuffer[CREG1] & (1 << MSTOP));
            dataFromCppUpdate(CREG1,MSTOP,bitvalue);
          }
          //    emit newRawData();
          bool enter =true;
         if(m_tcpSocket->waitForReadyRead())
            {
            qDebug()<<"I am waiting for ACK...";

             if((m_oldData[SREG1] & (1 << ACKSTART)))//how should I wait here till that bit is enabled?
                {
                 qDebug()<<"Ack received please disable the Bit";
                }
            }
    qDebug()<<"homing is done";
    }

再一次,我几乎每30毫秒从客户端获取数据,我正在将它读取到receivedData []。这意味着连接(m_tcpSocket,SIGNAL(readyRead()),this,SLOT(socketReadyRead()));每30ms调用一次socketReadyRead()。所以我的IF语句有效。但是我必须等到从客户端接收的68Bytes(比如第3个字节的第3位)中的一个位被启用。它继续发送68个字节的数据(每30ms)但是过了一段时间当工作完成时,它将通过启用第10个字节的第3位(ACKSTART)(SREG1)向我发送Ack(几乎在10Sec之后而不是ms)。if((m_oldData[SREG1] & (1 << ACKSTART)))//how should I wait here till this bit is enabled? 任何人都可以告诉我在没有冻结GUI的情况下等待的逻辑。我是否需要将此函数startHoming置于单独的Qthread中?如果是这样怎么办?请给我举个例子。非常感谢

0 个答案:

没有答案