我正在尝试将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
我认为这是某种内存泄漏,但我无法看到代码中的原因。
答案 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));
}