我试图通过将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兆字节后,手机中出现"Memory Full“消息框,调试输出中显示以下消息:
[Qt Message] CActiveScheduler::RunIfReady() returned error: -4我假设这是某种内存泄漏,但我在代码中看不到是什么导致了它。
发布于 2012-12-16 19:30:37
好吧,事实证明套接字的缓冲区增长不受控制,因为数据输入到套接字的速度比刷新数据的速度要快。
我修复了这个问题,通过检查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));
}https://stackoverflow.com/questions/13900051
复制相似问题