gpt4 book ai didi

c++ - 为什么我的代码无法读取 QTcpSocket 上可用的字节数?想法?

转载 作者:搜寻专家 更新时间:2023-10-30 23:59:22 34 4
gpt4 key购买 nike

我在循环主体中有以下代码片段,负责从 QTcpSocket 读取数据(nntp 是指向 QTcpSocket 的指针)。

std::vector<char> buffer;
int bytesAvailable = nntp->bytesAvailable();
qDebug() << "bytesAvailable: "<<bytesAvailable;
if(bytesAvailable <= 0) break;
buffer.resize(bytesAvailable);
bytesRead = nntp->read(&buffer[0], bytesAvailable);
qDebug() << (nntp->state() == QAbstractSocket::ConnectedState);
qDebug() << "bytesRead: "<<bytesRead;

间歇性地,这会输出类似于以下内容的内容:

bytesAvailable:  24 
true
bytesRead: 0

然后我的代码出现了错误。这对我来说似乎很奇怪,表明我完全误解了 QTcpSockets 的工作原理。当然,如果 bytesAvailable > 0 那么后续读取将意味着可以将 bytesAvailable 字节读入缓冲区,在这种情况下 bytesRead 应该 == bytesAvailable。或者我错过了什么?我目前怀疑这可能是某种内存损坏..

编辑:抛出一些 nntp.errorString() 消息报告说在此失败期间,“网络操作超时”。我需要调查这意味着什么......(想法?)

编辑 2:似乎“网络操作超时”只是意味着读取超时。当代码按预期运行时(即间歇性运行),我仍然收到此“错误”。

编辑 3:可以找到上述代码片段的完整算法上下文 at this pastebin link .

编辑 4:编辑 3 中的函数版本略有不同,但仍然存在相同的问题,位于 this newer pastebin link

最佳答案

我发现了这个问题:我一直试图读取的 QTcpSocket 属于另一个线程。即使字节根据 QIODevice 的缓冲区可用,也因此无法读取。

因此:

* 始终确保您要读取的套接字属于您要进行读取的线程 *

为了解决这个问题,正如 Taylor 在上面所建议的那样,可以利用 QTcpSocket 的信号和插槽基础结构(首选)。这具有适当的线程基础设施,理论上应该使事情变得简单得多。

要格外小心

(a)利用自己的QThread,将包含QTcpSocket的对象移动到这个QThread

然后,

(b) 在这个其他线程的阻塞读取循环中使用 QTcpSocket 的 waitForReadyRead。

后一种方法比较困难,因为如果想在以后的读写中为其他线程保留 QTcpSocket,那么在它被移动到另一个线程并由另一个线程处理后,必须将它移回主线程在它可以被移动到另一个线程之前。 -- 光是想说这个词就让我头疼!当然,人们可能会选择始终保持同一个 QTcpSocket 工作线程,这样它只需移动一次,或者简单地在每次需要 QTcpSocket 时创建一个新的 QTcpSocket,将其移动到自己的 QThread,然后在完成后立即将其删除与。

基本上,如果可以,请使用第一种信号和槽方法。

关于c++ - 为什么我的代码无法读取 QTcpSocket 上可用的字节数?想法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16653117/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com