2

GPSデータを受信し、データベースに保存してサーバーに投稿しようとするsymbian用のQtアプリケーションがあります。最初の 2 つのステップは正常に機能しますが、投稿を続けると、アプリケーションがクラッシュするか、インターネット接続が切断されます。

デバッグ目的でアプリケーションを変更して、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 N97mi​​ni、5230、および 5800 でこれをテストしましたが、すべて同じように動作します。

編集。インターネット接続が「停止」した場合でも、3G がオンになっていることはわかりますが、Web ブラウザを使用したインターネットへの接続は失敗します。アプリケーションを閉じて、ブラウザーでインターネットに接続しようとすると、「Web: メモリがいっぱいです...」と表示されます (アプリからの Web 要求は正常に動作します) Nokia Energy プロファイラーを使用していますが、メモリの兆候は見られませんいっぱいです。これをテストして、2 つのゲーム、ovi マップ、およびその他の多数のアプリケーションを開始したところ、40MB を超えるメモリを消費したにもかかわらず、正常に動作しました。

4

1 に答える 1

0

私が Qt で行っている唯一のネットワーク コードはデスクトップ プラットフォーム上にあり、その場合でもそれを調べる必要があるという警告がありますが、明らかなことは何もわかりません。また、私自身のコードでは、deletelater() が「後で」とは何かについて、私とは異なる考えを持っている場合があることも知っています。私はそれを調べる時間がなく、ここで間違っているかもしれませんが、deletelater() は実際にはイベント スレッドで実行されていると思います。イベント スレッドが常にビジーである場合、いつオブジェクトを削除する時間がありますか? デバッグ目的で、deletelater() を delete に置き換えます (実際には、クリーンアップする必要がある親子関係がない限り、deletelater() を使用する理由はなく、手動で削除する方法があるかもしれません)親からの子であるため、delete を呼び出すときにポインターがぶら下がっていることを心配する必要はありません)。

また、メモリ消費テストの精度もわかりません。割り当てられたメモリ テストは現在のスレッドを参照していますか? 現在のプロセスは?プログラムはヒープからメモリの「チャンク」を受け取りましたが、それは単にそれ自体で管理され、それ以上の使用は許可されていませんか? このフレームワークについては、あなたの方が私よりもはるかによく知っていると思います。これらはあなたが試してみるためのほんのいくつかの考えです.

于 2010-10-04T10:30:57.290 に答える