如何读取QLocalSocket / QDataStream?
我有一个程序通过使用QLocalSocket
和QDataStream
的命名管道与另一个程序进行通信。下面的recieveMessage()
广告位与QLocalSocket
的{{1}}信号相关联。
readyRead()
我发现应用程序有时挂起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);
}
...
}
。也就是说,它成功读取4字节标题,但从不从readRawData()
返回。
如果我添加......
readRawData()
...到这个函数的开头,应用程序工作正常(使用简短的测试消息)。
我猜测(文档非常稀疏)发生了某种死锁,我必须使用if (m_socket->bytesAvailable() < 5)
return;
信号逐渐建立缓冲区而不是阻塞。
这是为什么?从QLocalSocket读取的正确方法是什么?
答案 0 :(得分:2)
你的循环阻止了事件循环,所以你永远不会得到数据,如果所有都没有到达pn第一次读取,是我认为是什么导致你的问题。
正确的方法是使用信号和插槽,readyRead
- 此处发出信号,只读取插槽中的可用数据,如果不够,请缓冲它并返回,并在下一个时读取更多信息信号。
请注意这种替代方法:如果您完全确定您期望的所有数据将立即到达(对于您控制客户端和服务器的本地套接字可能并非不合理),或者如果整个事情都在一个没有其他功能的线程中,那么可以使用waitForReadyRead
方法。但事件循环将保持阻塞状态,直到数据到达,例如冻结GUI(如果在GUI线程中),并且通常很麻烦。