1

bytesWritten我正在尝试通过连接到我的函数以非阻塞方式传输大文件sendNextBlock

void AsynchronousRetrieveCommand::start()
{
    connect(socket(), SIGNAL(bytesWritten(qint64)), this, SLOT(sendNextBlock()));
    sendNextBlock();
}

void AsynchronousRetrieveCommand::sendNextBlock()
{
    socket->write(file->read(64*1024));
}

我在 Symbian 手机上运行此代码,在传输了 5-6 兆字节后,手机中出现“内存已满”消息框,调试输出中显示以下消息:

[Qt Message] CActiveScheduler::RunIfReady() returned error: -4

我认为这是某种内存泄漏,但我在我的代码中看不到是什么原因造成的。

4

1 回答 1

3

好的,事实证明套接字的缓冲区无法控制地增长,因为数据被提供给它的速度比它被刷新的速度要快。

我通过检查 给出的值解决了这个问题bytesWritten,并且只写入了这么多字节(实际上,将缓冲区重新填充回 64k)。

我的固定代码现在看起来像这样:

void AsynchronousRetrieveCommand::start()
{
    connect(socket(), SIGNAL(bytesWritten(qint64)), this, SLOT(sendNextBlock(qint64)));
    sendNextBlock(64*1024);
}

void AsynchronousRetrieveCommand::sendNextBlock(qint64 bytes)
{
    socket()->write(file->read(bytes));
}
于 2012-12-16T11:30:37.090 回答