使用QTcpSocket传输大文件时“内存已满”

时间:2012-12-16 09:32:40

标签: c++ qt memory-leaks qtcpsocket

我正在尝试将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

我认为这是某种内存泄漏,但我无法看到代码中的原因。

1 个答案:

答案 0 :(得分: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));
}
相关问题