質問

I'm trying to transfer a large file in a non-blocking fashion, by connecting bytesWritten to my function sendNextBlock.

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

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

I'm running this code on a Symbian phone, and after 5-6 megabytes have been transferred I'm getting "Memory Full" message box in the phone, and this message in the debug output:

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

I assume this is some kind of a memory leak, but I can't see what's causing it in my code.

役に立ちましたか?

解決

Ok, it turned out the socket's buffer was growing uncontrollably because data was being fed to it faster than it could be flushed.

I fixed the problem by checking the value given by bytesWritten, and writing only so much bytes (in effect, refilling the buffer back to 64k).

My fixed code now looks like this:

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));
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top