ПРИМЕЧАНИЕ. КОД, ПРЕДОСТАВЛЯЕМЫЙ ПРОСТО, ДАЕТ ИДЕЮ СТРУКТУРЫ ПРИМЕНЕНИЯ
У меня есть приложение Qt, взаимодействующее с внешним оборудованием. Структура такова, что класс для взаимодействия с оборудованием наследуется от QObject
и состоит из основного класса потока GUI. Допустим, класс - test.h, вот его пример кода:
#ifndef TEST_H
#define TEST_H
#include <QLineEdit>
#include <QString>
#include <QTimer>
#include "ui_test.h"
#define TIMEOUT 100
class TestObj;
class TestApp:public QWidget, public Ui::mTestForm
{
Q_OBJECT
public:
TestApp(QWidget* parent=0);
QTimer* mTimer;
bool mWindowClosed;
TestObj* mObj;
public slots:
void UpdateText();
void Exit();
};
class TestObj:public QObject
{
Q_OBJECT
public:
TestObj();
void RandomTest();
};
#endif
Код для test.cpp:
#include "test.h"
TestApp::TestApp(QWidget* parent):QWidget(parent)
{
setupUi(this);
mObj = new TestObj();
mWindowClosed=false;
mLineEdit->setText("Hello");
mTimer=new QTimer();
mTimer->singleShot(1000,this,SLOT(UpdateText()));
connect(mExitButton,SIGNAL(clicked()),this, SLOT(Exit()));
}
void TestApp::UpdateText()
{
if(mWindowClosed)
{
//QApplication::processEvents();
return;
}
else
{
//QApplication::processEvents();
mObj->RandomTest();
mLineEdit->setText("Hi");
mTimer->singleShot(100,this,SLOT(UpdateText()));
}
}
void TestApp::Exit()
{
mWindowClosed=true;
}
Теперь рассмотрим, что класс TestObj
используется для взаимодействия с оборудованием. Этот класс отправляет три возможные команды (в реальном коде, приведенный выше просто пример структуры) с различными таймаутами на аппаратное обеспечение, поэтому у нас есть таймер, который используется при отправке команд (реализованных в виде функций) на аппаратное обеспечение. Каждый из них имеет запись processEvents
, чтобы определить любые изменения в переменных за это время.
Проблема в том, что этот модуль отвечает за устойчивый рост памяти во время выполнения программы.
Когда я закомментирую функцию UpdateText()
в конструкторе TestApp
, приложение работает нормально.
Я предполагаю, что, скорее всего, существует очередь сигнальных слотов, из-за которой увеличивается память, потому что происходит много событий графического интерфейса. А так как класс не реализован как отдельный поток и не объединен с основным потоком GUI. Происходит постоянное обновление основного потока.
Может кто-нибудь предложить выход? У меня нет полномочий изменять дизайн, иначе я бы реализовал интерфейсный класс в виде потока. Поэтому, если можно предложить решение с текущим дизайном, как оно есть, это было бы полезно.