首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QNetworkAccessManager内存问题

QNetworkAccessManager内存问题
EN

Stack Overflow用户
提问于 2016-05-10 07:15:51
回答 2查看 337关注 0票数 0

我正在开发一个应用程序,它使用QtNetworkAccessManager向服务器发送请求并存储回复。我已经使它工作,但内存使用是不断增加,直到和它阻止了整个PC。我认为这个问题与调用删除器()和事件循环有关,但我看不出如何修复它。以下是代码:

main.cpp

代码语言:javascript
复制
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    ReadConfig();
    Ethernet M2;
    return a.exec();
}

Ethernet.h

代码语言:javascript
复制
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);
};

Ethernet.cpp

代码语言:javascript
复制
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();
}

如有任何建议,我将不胜感激。谢谢!

EN

回答 2

Stack Overflow用户

发布于 2016-05-10 07:57:27

您需要从QObject中子类以太网以正确使用事件循环。

票数 0
EN

Stack Overflow用户

发布于 2016-05-10 08:18:23

您不能使用QNetworkAccessManager创建多个对象。正如文档所述,“对于整个Qt应用程序来说,一个QNetworkAccessManager就足够了”,参考链接。如果生成以太网类的多个对象,则会产生内存问题。您还需要将QObject作为以太网的基类。

代码语言:javascript
复制
manager = new QNetworkAccessManager(this);
this (Ethernet) must have QObject as base class.
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37131681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档