0

QtNetworkAccessManager を使用してサーバーに要求を送信し、応答を保存するアプリケーションを開発しています。私はそれを機能させましたが、メモリ使用量が継続的に増加し、PC全体がブロックされます。問題は deletelater() の呼び出しとイベント ループに関連していると思いますが、修正方法がわかりません。コードは次のとおりです。

main.cpp

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    ReadConfig();
    Ethernet M2;
    return a.exec();
}

イーサネット.h

class Ethernet : public QObject
{
    Q_OBJECT

public:
    Ethernet();
    ~Ethernet();
    QTimer *timer;

private
    QNetworkAccessManager *manager;

public slots:
    void Cycle();
    void replyAuthenticationRequired(QNetworkReply *reply, QAuthenticator *auth);
    void replyFinished(QNetworkReply *reply);
};

イーサネット.cpp

Ethernet::Ethernet() 
{
    timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(Cycle()));
    timer->start(1000);

    manager = new QNetworkAccessManager(this);
    connect(manager, SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)), this, SLOT(replyAuthenticationRequired(QNetworkReply*,QAuthenticator*)));
    connect(manager, SIGNAL(finished(QNetworkReply*)), this,     SLOT(replyFinished(QNetworkReply*)));
}

void Ethernet::Cycle()
{
    for (BYTE i=0; i< NUM_TOTAL_VEHICLES; i++)
    {
        FailCheck(i,FILTER_VALUE_PRIORITY_A1);
        FailCheck(i,FILTER_VALUE_PRIORITY_A);
        FailCheck(i,FILTER_VALUE_PRIORITY_B);
        FailCheck(i,FILTER_VALUE_PRIORITY_C);
    }
}

void Ethernet::FailCheck (BYTE coach, BYTE priority)
{
    //Build a valid URL
    QString qsURL = "http://";
    ...
    ..
    .
    //

    manager->get(QNetworkRequest(QUrl(qsURL)));
}

void Ethernet::replyAuthenticationRequired(QNetworkReply *reply, QAuthenticator *auth)
{
   if(!reply->error())
   {
       auth->setUser(DB_USR);
       auth->setPassword(DB_PWD);
   }
   reply->deleteLater();
}

void Ethernet::replyFinished (QNetworkReply *reply)
{
    if(!reply->error())
    {
        //Do some task with the reply;
    }
    reply->deleteLater();
}

提案をいただければ幸いです。ありがとうございました!

4

3 に答える 3

0

クラスがスレッドでない場合は、継承しないでくださいQThread。から継承するQObjectか、できない場合はM2スレッドを開始します。現在、 のスレッド ループがEthernet機能せず、ネットワーク応答がEthernetイベント ループに類似しているようです (それらを削除する要求は、開始されていないイベント ループに投稿されEthernetます)

むしろ、スロットはまったく実行されないため、ネットワーク応答は作成されますが、スロットが実行されないため (上記の理由により) 削除されることはありません。メインスレッドでdeleteLaterそれらを正しく削除する必要がありますが、呼び出されることはありません。

于 2016-05-10T09:14:18.160 に答える
0

イベントループを適切に使用するには、QObject から Ethernet をサブクラス化する必要があります

于 2016-05-10T07:57:27.923 に答える