首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何读取QLocalSocket/QDataStream以避免死锁?

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

Stack Overflow用户
提问于 2016-12-30 13:31:21
回答 1查看 632关注 0票数 0

如何读取QLocalSocket/QDataStream?

我有一个使用QLocalSocketQDataStream通过命名管道与另一个人通信的程序。下面的recieveMessage()插槽连接到QLocalSocketreadyRead()信号。

代码语言:javascript
复制
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()返回。

如果我加上..。

代码语言:javascript
复制
if (m_socket->bytesAvailable() < 5)
    return;

...to这个函数的开始,应用程序可以正常工作(使用简短的测试消息)。

因此,我猜测(文档非常稀少)存在某种类型的死锁,我必须使用bytesAvailable()信号来逐步构建缓冲区,而不是阻塞。

,这是为什么?从QLocalSocket?中读取正确的方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-30 13:54:24

您的循环阻塞了事件循环,所以如果所有的数据都没有到达pn第一次读取,那么您就永远得不到数据,这就是我认为导致您的问题的原因。

正确的方法是使用信号和插槽,这里是readyRead-signal,只读取插槽中的可用数据,如果没有足够的数据,缓冲它并返回,在得到下一个信号时读取更多。

注意这一替代方法:如果您绝对确信所有您期望的数据都会迅速到达(可能不是不合理的本地套接字,您控制客户端和服务器),或者如果整个事情都在一个线程中,而没有其他任何东西,那么使用waitForReadyRead方法可能是可以的。但是事件循环将一直被阻塞,直到数据到达,例如冻结GUI (如果在GUI线程中),并且通常是麻烦的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41397126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档