如何读取QLocalSocket / QDataStream以避免死锁?

时间:2016-12-30 13:31:22

标签: c++ qt named-pipes qlocalsocket

如何读取QLocalSocket / QDataStream?

我有一个程序通过使用QLocalSocketQDataStream的命名管道与另一个程序进行通信。下面的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读取的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

你的循环阻止了事件循环,所以你永远不会得到数据,如果所有都没有到达pn第一次读取,是我认为是什么导致你的问题。

正确的方法是使用信号和插槽,readyRead - 此处发出信号,只读取插槽中的可用数据,如果不够,请缓冲它并返回,并在下一个时读取更多信息信号。

请注意这种替代方法:如果您完全确定您期望的所有数据将立即到达(对于您控制客户端和服务器的本地套接字可能并非不合理),或者如果整个事情都在一个没有其他功能的线程中,那么可以使用waitForReadyRead方法。但事件循环将保持阻塞状态,直到数据到达,例如冻结GUI(如果在GUI线程中),并且通常很麻烦。