processEvents и утечка памяти? - PullRequest
       9

processEvents и утечка памяти?

1 голос
/ 24 августа 2009

ПРИМЕЧАНИЕ. КОД, ПРЕДОСТАВЛЯЕМЫЙ ПРОСТО, ДАЕТ ИДЕЮ СТРУКТУРЫ ПРИМЕНЕНИЯ

У меня есть приложение 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. Происходит постоянное обновление основного потока.

Может кто-нибудь предложить выход? У меня нет полномочий изменять дизайн, иначе я бы реализовал интерфейсный класс в виде потока. Поэтому, если можно предложить решение с текущим дизайном, как оно есть, это было бы полезно.

Ответы [ 2 ]

1 голос
/ 24 августа 2009

Создание обычного таймера, установка его интервала на 100 и подключение его сигнала тайм-аута к Функция UpdateText позволит избежать накопления событий.

P.S .: Вам не нужен QTimer объект для singleShot, вы можете вызвать QTimer::singleShot напрямую.

0 голосов
/ 24 августа 2009

Дикая догадка:

Попробуйте изменить это:

mTimer->singleShot(100,this,SLOT(UpdateText()));

к этому:

if (!slotSet) 
{
    mTimer->singleShot(100,this,SLOT(UpdateText()));
    slotSet = true;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...