Я разрабатываю приложение, которое отправляет запросы на сервер с помощью QtNetworkAccessManager и сохраняет ответы. Я заработал, но использование памяти постоянно увеличивается, и оно блокирует весь компьютер. Я думаю, что проблема связана с вызовом deleteelater() и цикла событий, но я не вижу, как это исправить. Вот код:Проблемы с памятью QNetworkAccessManager
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();
}
Я признателен за любые предложения. Спасибо!
У вас нет цикла событий в вашем классе Ethernet, поэтому deleteLater - не работает – tty6
Код, который вы опубликовали, не может быть скомпилирован, ваш класс 'Ethernet' имеет слоты и макрос' Q_OBJECT', но не наследует 'QObject', каков ваш фактический код? – ixSci
Благодарим вас за ответы. Мой класс Ethernet наследуется от QThread, потому что он был потоком, но не больше. Таким образом, реальной реализацией класса является «class Ethernet :: public QThread». Я исправил в главном посте. – Puccinih