如何读取QLocalSocket/QDataStream?
我有一个使用QLocalSocket和QDataStream通过命名管道与另一个人通信的程序。下面的recieveMessage()插槽连接到QLocalSocket的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);
}
...
} 我发现应用程序有时挂在readRawData()上。也就是说,它成功地读取了4个字节的头,但却从未从readRawData()返回。
如果我加上..。
if (m_socket->bytesAvailable() < 5)
return;...to这个函数的开始,应用程序可以正常工作(使用简短的测试消息)。
因此,我猜测(文档非常稀少)存在某种类型的死锁,我必须使用bytesAvailable()信号来逐步构建缓冲区,而不是阻塞。
,这是为什么?从QLocalSocket?中读取正确的方法是什么?
发布于 2016-12-30 13:54:24
您的循环阻塞了事件循环,所以如果所有的数据都没有到达pn第一次读取,那么您就永远得不到数据,这就是我认为导致您的问题的原因。
正确的方法是使用信号和插槽,这里是readyRead-signal,只读取插槽中的可用数据,如果没有足够的数据,缓冲它并返回,在得到下一个信号时读取更多。
注意这一替代方法:如果您绝对确信所有您期望的数据都会迅速到达(可能不是不合理的本地套接字,您控制客户端和服务器),或者如果整个事情都在一个线程中,而没有其他任何东西,那么使用waitForReadyRead方法可能是可以的。但是事件循环将一直被阻塞,直到数据到达,例如冻结GUI (如果在GUI线程中),并且通常是麻烦的。
https://stackoverflow.com/questions/41397126
复制相似问题