processEvents和内存泄漏?

时间:2009-08-24 06:39:29

标签: c++ linux qt

注意:提供的代码只是给出了应用程序结构的概念

我有一个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事件,因此很可能存在由于内存增加而导致的信号槽排队。并且由于该类未实现为单独的线程并且与主GUI线程共存。主线程不断更新。

有人可以建议出路吗?我没有权限更改设计,否则我会将接口类实现为线程。因此,如果可以使用当前设计建议解决方案,那将是有益的。

2 个答案:

答案 0 :(得分:1)

创建常规计时器,将其间隔设置为100并将其timout信号连接到 UpdateText函数可以避免事件堆积起来。

P.S:QTimer您不需要singleShot个对象,可以直接致电QTimer::singleShot

答案 1 :(得分:0)

疯狂猜测:

尝试更改此内容:

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

到此:

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