참고 : 제공된 코드는 응용 프로그램의 구조에 대한 정보를 제공합니다.processEvents 및 메모리 누수?
Qt 응용 프로그램과 외부 하드웨어 간의 인터페이스가 있습니다. 구조는 하드웨어와 인터페이싱하기위한 클래스가 QObject
에서 상속 받고 메인 GUI 쓰레드 클래스로 구성된다. 의 클래스가 test.h라고하자, 여기의 샘플 코드입니다 : Test.cpp에 대한
#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
코드
#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
항목이있어 그 동안 변수에 대한 변경 사항을 식별합니다.
문제는이 모듈이 프로그램 실행 중에 메모리가 지속적으로 증가한다는 것입니다.
TestApp
생성자에서 UpdateText()
함수를 주석 처리하면 앱이 정상적으로 작동합니다.
내 생각에 많은 양의 GUI 이벤트가 발생하기 때문에 메모리가 증가하는 신호 슬롯의 대기열이있을 가능성이 높습니다. 그리고 클래스는 별도의 스레드로 구현되지 않고 기본 GUI 스레드와 결합하기 때문에. 주 스레드의 지속적인 업데이트가 있습니다.
누군가 퇴장을 제안 할 수 있습니까? 그렇지 않으면 인터페이스 클래스를 스레드로 구현했을 것입니다. 따라서 솔루션이 현재 설계대로 제안 될 수 있다면 이점이 있습니다.
왜 복제본으로 폐쇄되는 것에 대해 걱정하십니까? 이제 당신이 그렇게 말했어, 나는 거의 모든 다른 질문을 통해이 하나가 정말로 중복이 아닌지보기 위해 사냥을하러 유혹을 받는다. –
나는 여전히 가장 일반적인 메모리 누출이라고 생각한다 : 확실히 당신은 삭제한다. 모든 문자열을 업데이트 할 때? 더 정확하게 말하면 : 새 문자열을 설정하기 전에 이전 문자열을 삭제합니까? (필요하다면). 그렇게 생각하지 마라. 정말로 문제 다. 그래서 나는 단지 코멘트한다. :) – StampedeXV