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 から読み取る正しい方法は何ですか?