Я пытаюсь передать большой файл неблокирующим способом, подключив 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
Я предполагаю, что это какая-то утечка памяти, но я не могу понять, что вызывает это в моем коде.
Хорошо, оказалось, что буфер сокета бесконтрольно рос, потому что данные подавались на него быстрее, чем его можно было сбросить.
Я исправил проблему, проверив значение, данное 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));
}
Других решений пока нет …