應該如何閱讀QLocalSocket/QDataStream?應該如何閱讀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;
...這個功能的啓動,應用程序工作正常(與短的測試消息)。
然後我猜測(文檔非常稀疏),發生了某種類型的死鎖,並且我必須使用bytesAvailable()
信號逐步建立緩衝區而不是阻塞。
這是爲什麼?從QLocalSocket讀取正確的方法是什麼?
謝謝,我沒有想到它是* my * loop阻塞(儘管我看到它在調試器中旋轉!)而不是readRawData()。 – sebf