Ich entwickle eine Anwendung, die Anforderungen an einen Server sendet, der QtNetworkAccessManager verwendet, und speichert die Antworten. Ich habe es geschafft, aber die Speicherbelegung steigt stetig an und blockiert den ganzen PC. Ich denke, das Problem hängt mit dem Aufruf von deleterater() und der Ereignisschleife zusammen, aber ich kann nicht sehen, wie ich es beheben kann. Hier ist der Code:QNetworkAccessManager Speicherprobleme
main.cpp
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
ReadConfig();
Ethernet M2;
return a.exec();
}
Ethernet.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);
};
Ethernet.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();
}
ich irgendwelche Vorschläge zu schätzen wissen. Vielen Dank!
Sie haben keine Ereignisschleife in Ihrer Ethernet-Klasse, also deleteLater - funktioniert nicht – tty6
Der von Ihnen gepostete Code kann nicht kompiliert werden, Ihre 'Ethernet' Klasse hat Slots und' Q_OBJECT' Makro, aber erbt 'QObject' nicht Was ist dein tatsächlicher Code? – ixSci
Vielen Dank für Ihre Antworten. Meine Ethernet-Klasse erbt von QThread, weil es früher ein Thread war, aber nicht mehr. Die eigentliche Implementierung der Klasse ist also "class Ethernet :: public QThread". Ich habe das in der Hauptpost korrigiert. – Puccinih