2016-02-10 3 views
0

Следующий код предназначен для отображения изображения, отправленного по сети. Я отправил заголовок из 16 байт, который я использую, чтобы вычислить размер изображения, который следует, а затем прочитал, что много байтов и отображает изображение. я использовал концепцию по этой ссылке Tcp packets using QTcpSocketЧтение сообщений переменной длины в Qtcp readyRead()

void socket::readyRead() 
{ 

while(socket->bytesAvailable() > 0) { 
    quint8 Data[16]; 

    socket->read((char *)&Data,16); 
    img_size = (((quint8)Data[1]<<8)+ (quint8)Data[0]) * (((quint8)Data[3]<<8)+ (quint8)Data[2]) * 1; 
    QByteArray buffer = socket->read(img_size); 


    while(buffer.size() < (img_size)) 
     { 
      // qDebug() << buffer.size(); 
       socket->waitForReadyRead(); 
       buffer.append(socket->read((img_size)-(buffer.size()))); 
      } 
    unsigned char* imgdatara = (unsigned char*)&buffer.data()[0]; 
     if(!image) 
     image = new QImage(imgdatara,32,640,QImage::Format_Grayscale8); 
     else 
     { 
     delete image; 
     image = new QImage(imgdatara,32,640,QImage::Format_Grayscale8); 
     } 

     emit msg(image); 
    }  
} 

Мой GUI говорит «не отвечает». Как мне это решить?

Благодаря

ответ

1

Это 100% рабочий код из книги "Qt 4.8 Professional программирования" Max Schlee в. Это не простой вопрос, потому что на readyRead() сигнала вы можете получить:
1. полный блок
2. Только часть блока
3. Несколько блоков вместе

void MyClass::onReceive() 
{ 
    QDataStream in(m_pClient); 
    in.setVersion(QDataStream::Qt_4_6); // Your version. Not necessary. 

    for(;;) 
    { 
     if(m_nextBlockSize == 0) 
     { 
      if(m_pClient->bytesAvailable() < sizeof(m_nextBlockSize)) 
      { 
       break; 
      } 
      else 
      { 
       in >> m_nextBlockSize; 
      } 
     } 

     if(m_pClient->bytesAvailable() < m_nextBlockSize) 
     { 
      break; 
     } 

     // Here you have each complete block 
     processYourBlockHere(); // <===== 

     m_nextBlockSize = 0; 
    } 
} 

Обновление: полезные ссылки для вас: Serializing Qt Data Types и QDataStream

+0

Спасибо Владимиру ... – Ramki

Смежные вопросы