注意:提供的代码只是给出了应用程序结构的概念
我有一个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线程共存。主线程不断更新。
有人可以建议出路吗?我没有权限更改设计,否则我会将接口类实现为线程。因此,如果可以使用当前设计建议解决方案,那将是有益的。
答案 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;
}