«Память заполнена» при передаче большого файла с использованием 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

Решение

Хорошо, оказалось, что буфер сокета бесконтрольно рос, потому что данные подавались на него быстрее, чем его можно было сбросить.

Я исправил проблему, проверив значение, данное bytesWrittenи запись только такого количества байтов (фактически, заполнение буфера обратно до 64 КБ).

Мой исправленный код теперь выглядит так:

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));
}
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]