C++ processEvents和内存泄漏?

C++ processEvents和内存泄漏?,c++,linux,qt,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

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

我有一个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

现在考虑<代码> TestObji类是用来与硬件接口的类。这个类向硬件发送三个可能的命令(在实际代码中,上面只是一个示例结构),它们具有不同的超时,因此我们有一个计时器,在向硬件发送命令(实现为函数)时使用它。其中每一个都有一个

processEvents
条目,用于标识变量的任何更改

问题是这个模块负责在程序执行期间内存的稳定增长

当我注释掉
TestApp
构造函数中的
UpdateText()
函数时,应用程序工作正常

我的猜测是,由于内存增加,很可能存在信号插槽的排队,因为有很多GUI事件发生。由于该类不是作为单独的线程实现的,而是与主GUI线程结合在一起的。主线程会不断更新

有人能建议一条出路吗?我无权更改设计,否则我会将接口类作为线程实现。因此,如果可以按照当前的设计提出解决方案,这将是有益的。

胡乱猜测:

尝试更改此选项:

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

if (!slotSet) 
{
    mTimer->singleShot(100,this,SLOT(UpdateText()));
    slotSet = true;
}
胡乱猜测:

尝试更改此选项:

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

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

创建一个常规计时器,将其间隔设置为100,并将其超时信号连接到
UpdateText
函数将避免事件堆积


注:对于
singleShot
,您不需要
QTimer
对象,您可以直接调用
QTimer::singleShot

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


注:对于
singleShot
,您不需要
QTimer
对象,您可以直接调用
QTimer::singleShot

为什么您担心它会作为副本关闭?既然你这么说了,我几乎忍不住要仔细研究所有其他问题,看看这一个是否真的是重复的…因为它仍然是最常见的内存泄漏,我想:你确定在更新字符串时删除了所有字符串吗?更准确地说:在设置新字符串之前是否删除旧字符串?(如有必要)。不过,我并不认为这是真正的问题所在,所以我只想说:)。你为什么担心它会被当作复制品关闭?既然你这么说了,我几乎忍不住要仔细研究所有其他问题,看看这一个是否真的是重复的…因为它仍然是最常见的内存泄漏,我想:你确定在更新字符串时删除了所有字符串吗?更准确地说:在设置新字符串之前是否删除旧字符串?(如有必要)。但不要认为这才是真正的问题,因此,我只是评论:)。这无法做到,因为我必须不断地向h/W发送命令。这无法做到,因为我必须不断地向h/W发送命令,以考虑我的问题,但这与QTimer对象无关。感谢考虑我的问题,但与QTimer对象无关。