Непрерывная загрузка вызывает ошибку QNetworkReply «Невозможно выделить память» - PullRequest
2 голосов
/ 04 октября 2010

У меня есть приложение Qt для symbian, которое получает данные GPS, сохраняет их в базе данных и пытается отправить их на сервер. Первые два шага работают нормально, но постоянная публикация либо приводит к сбою моего приложения, либо к разрыву моего интернет-соединения.

Я изменил свое приложение для целей отладки, чтобы оно отправляло данные на сервер только каждую 10-ю секунду. Приложение работает нормально в течение 45-90 минут без значительного увеличения памяти.

После этого я получу ошибку от QNetworkReply, говорящую «Невозможно выделить память» .
В то же время использование памяти увеличивается примерно на 63500 (байт?).
При следующей загрузке я получу ответ, который говорит «Неверный дескриптор сокета» , и после этого мой вывод отладки QtCreator заполняется исключением «на 7 [будет делать setdefaultif (0) - взломать ""

Кто-нибудь знает, что здесь происходит не так? Я не могу найти ошибки в своем коде загрузки, которые могут быть причиной этого.

Вот мой скрипт загрузки.

void MainWindow::upload() {
    //Content of postData below. Using same data on every upload now when tracking the bug
    //[{"timestamp":"2010-10-01T17:10:27","latitude":62.1823321,"longitude":25.73226825,"user":6}]
    QByteArray postData; 

    QNetworkRequest request;
    request.setUrl(uploadUrl);
    this->qnam->post(request, postData);
}

void MainWindow::serviceRequestFinished(QNetworkReply* reply) {
    QByteArray bytes = reply->readAll();

    if (reply->error() == QNetworkReply::NoError)
    {
         //nothing in here when debugging
    } else {
        qDebug() << "-------Reply error: " + reply->errorString();
    }

    reply->deleteLater();
    updateHeapStats();
}

void MainWindow::updateHeapStats() { 
#ifdef Q_OS_SYMBIAN
        TInt mem, size, limit;
        User::Heap().AllocSize(mem);
        size = User::Heap().Size();
        limit = User::Heap().MaxLength();
        qDebug() << "**DEBUG MEMORY - > Memory:     " << QString::number(mem);
        qDebug() << "**DEBUG MEMORY - > Heap limit: " << QString::number(limit);
        qDebug() << "**DEBUG MEMORY - > Heap size:  " << QString::number(size);
#endif
}

Чаще всего забыл, я проверил это с Nokia N97mini, 5230 и 5800, и все они ведут себя одинаково.

редактировать. Забыл упомянуть, что, когда интернет-соединение "умирает", я все еще вижу, что 3G включен, но не удается подключиться к интернету через веб-браузер. Когда я закрываю приложение и пытаюсь подключиться к Интернету через браузер, он говорит: «Интернет: память заполнена, ...» (веб-запросы из приложений работают нормально) Я использую профилировщик Nokia Energy, и он не показывает никаких признаков памяти быть полным. Даже проверил это и запустил 2 игры, ovi-карты и множество других приложений, и они работали нормально, хотя они занимали более 40 МБ памяти.

1 Ответ

0 голосов
/ 04 октября 2010

С учетом того, что единственный сетевой код, который я делаю в Qt, находится на платформе для настольных компьютеров, и даже тогда мне нужно его искать, я не вижу ничего очевидного. Я также знаю, что в моем собственном коде deletelater () иногда имеет другое представление о том, что «позже», чем я. У меня нет времени на его поиск, и я могу ошибаться, но я думаю, что deletelater () действительно работает в потоке событий, и если ваш поток событий всегда занят, когда у него будет время для удаления объекта? В целях отладки я бы заменил deletelater () на delete (и действительно, нет смысла использовать deletelater (), если только у вас нет отношения родитель / потомок, который нужно очистить, и может быть способ удалить вручную). ребенок от родителя, поэтому вам не нужно беспокоиться о висячих указателях при вызове delete).

Я также не знаю точности вашего теста потребления памяти. Относится ли тест выделенной памяти к текущему потоку? Текущий процесс? Получает ли программа «кусок» памяти из кучи, которую она просто управляет самостоятельно, и ей не разрешено использовать больше, чем? Я думаю, что вы знаете эту структуру гораздо лучше, чем я; это всего лишь некоторые мысли, которые вы можете попробовать.

...