2009-08-24 12 views
1

注:提供されるコードは、アプリケーションの構造のIDを提供するだけです。processEventsとMemory Leak?

私はQtアプリケーションを外部ハードウェアとインターフェースしています。ハードウェアとのインタフェースのためのクラスがQObjectから継承し、メインのGUIスレッドクラスで構成されているような構造です。 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クラスは、ハードウェアとのインタフェースに使用したものであることを考慮されています。ここではそのサンプルコードは、のクラスがTEST.Hあるとしましょう。このクラスは、ハードウェアに対して異なるタイムアウトを持つ3つの可能なコマンド(実際のコードでは上記は単なるサンプル構造です)を送信します。このため、ハードウェアにコマンド(関数として実装)を送信するときに使用されるタイマーがあります。これらのそれぞれにはprocessEventsというエントリがあり、その間の変数の変更を識別します。

問題は、このモジュールがプログラムの実行中にメモリが順調に上昇することです。

TestAppコンストラクタでUpdateText()関数をコメントアウトすると、アプリは正常に動作します。

私が推測しているのは、多くのGUIイベントが発生しているため、メモリが増加するために信号スロットがキューに入れられている可能性が高いからです。クラスは別のスレッドとして実装されておらず、メインのGUIスレッドと連携しているためです。メインスレッドの継続的な更新があります。

誰かが退出を提案できますか?私はデザインを変更する権限がありません。それ以外の場合は、インターフェイスクラスをスレッドとして実装します。したがって、現在の設計をそのまま使用して解決策を提示することができれば、それは有益です。

+1

なぜあなたはそれが複製としてクローズされることを心配していますか?今あなたが言ったので、私はほとんどすべての他の質問を狩りに行き、この人物が本当に重複していないかどうかを調べるように誘惑されています... –

+0

それはまだ最も一般的なメモリリークですので、すべての文字列を更新するときは?より正確には、新しい文字列を設定する前に古い文字列を削除しますか? (必要であれば)。それは本当に問題だとは思わないので、私はただコメントします:)。 – StampedeXV

答えて

0

ワイルド推測:

これを変更してみてください。これに

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

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

私はh/w – rocknroll

1

は、定期的なタイマーを作成する100にその間隔を設定し、 にそのTIMOUT信号を接続しますUpdateText関数は、イベントが積み重なるのを避けます。

P.S:singleShotQTimerオブジェクトは必要ありません。QTimer::singleShotに直接電話することができます。

+0

に質問を送ってくれてありがとうが、QTimerオブジェクトについてのコマンドではありません。 – rocknroll