gpt4 book ai didi

c++ - processEvents 和内存泄漏?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:12:56 24 4
gpt4 key购买 nike

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

我有一个与外部硬件交互的 Qt 应用程序。该结构是这样的,用于与硬件接口(interface)的类继承自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 类是用于与硬件接口(interface)的类。这个类向硬件发送三个可能的命令(在实际代码中,以上只是一个示例结构),具有不同的超时时间,因此我们有一个定时器,用于向硬件发送命令(作为函数实现)。其中每一个都有一个 processEvents 条目,以识别同时对变量的任何更改。

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

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

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

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

最佳答案

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

P.S: singleShot 不需要QTimer 对象,可以直接调用QTimer::singleShot

关于c++ - processEvents 和内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1320781/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com