Как читать 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?
спасибо, мне не приходило в голову, что это было * мой * цикл блокировки (хотя я видел, как он вращался в отладчике!), А не readRawData(). – sebf