QLocalSocket/QDataStream应该怎么读?
我有一个程序通过命名管道使用QLocalSocket
and与另一个程序通信QDataStream
。下面的recieveMessage()
插槽连接到QLocalSocket
'sreadyRead()
信号。
void MySceneClient::receiveMessage()
{
qint32 msglength;
(*m_stream) >> msglength;
char* msgdata = new char[msglength];
int read = 0;
while (read < msglength) {
read += m_stream->readRawData(&msgdata[read], msglength - read);
}
...
}
我发现应用程序有时会挂起readRawData()
。也就是说,它成功读取了 4 字节的标头,但之后再也没有从readRawData()
.
如果我添加...
if (m_socket->bytesAvailable() < 5)
return;
...到此功能的开始,应用程序运行良好(带有简短的测试消息)。
我当时猜测(文档非常稀少)发生了某种死锁,我必须使用bytesAvailable()
信号来逐渐建立缓冲区而不是阻塞。
为什么是这样?从 QLocalSocket 读取的正确方法是什么?