2009-08-24 3 views
1

참고 : 제공된 코드는 응용 프로그램의 구조에 대한 정보를 제공합니다.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 스레드와 결합하기 때문에. 주 스레드의 지속적인 업데이트가 있습니다.

누군가 퇴장을 제안 할 수 있습니까? 그렇지 않으면 인터페이스 클래스를 스레드로 구현했을 것입니다. 따라서 솔루션이 현재 설계대로 제안 될 수 있다면 이점이 있습니다.

+1

왜 복제본으로 폐쇄되는 것에 대해 걱정하십니까? 이제 당신이 그렇게 말했어, 나는 거의 모든 다른 질문을 통해이 하나가 정말로 중복이 아닌지보기 위해 사냥을하러 유혹을 받는다. –

+0

나는 여전히 가장 일반적인 메모리 누출이라고 생각한다 : 확실히 당신은 삭제한다. 모든 문자열을 업데이트 할 때? 더 정확하게 말하면 : 새 문자열을 설정하기 전에 이전 문자열을 삭제합니까? (필요하다면). 그렇게 생각하지 마라. 정말로 문제 다. 그래서 나는 단지 코멘트한다. :) – StampedeXV

답변

0

추측 :

이 변화보십시오

if (!slotSet) 
{ 
    mTimer->singleShot(100,this,SLOT(UpdateText())); 
    slotSet = true; 
} 
+0

내가 계속 h/w – rocknroll

1

, 정기 타이머를 생성 (100)의 간격을 설정하고 그것 timout 신호 연결이 행

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

UpdateText 함수는 이벤트가 쌓이는 것을 방지합니다.

피씨 : singleShotQTimer 개체가 필요하지 않은 경우 QTimer::singleShot으로 직접 전화 할 수 있습니다.

+0

내 질문을 고려해 주셔서 고마워하지만 QTimer 개체에 대한 명령을 보낼 수 없기 때문에이 작업을 수행 할 수 없습니다. – rocknroll