gpt4 book ai didi

c++ - 从 C++ 设置变量时 QML 内存泄漏

转载 作者:行者123 更新时间:2023-11-28 05:47:29 27 4
gpt4 key购买 nike

我正在使用 VS2013 在 Windows 7 上编写一个 QtQuick GUI,并试图获得一个工具来在 Canvas 上绘制图形。在我尝试设置我定义的 Canvas 属性之一之前,该图效果很好。当我这样做时,程序会生成一个白色窗口,内存使用量从正常的几百兆增加到几兆然后死掉。

时间线图.qml

import QtQuick 2.0
import QtCharts 2.0

Item
{
id: timeLineGraphItem
objectName: "timeLineGraphItem"

width: 500
height: 500

Canvas
{
id: timeLineGraphCanvas
objectName: "timeLineGraphCanvas"

width: 500
height: 500

// The unitless scale of each tic
property variant ticMeasures: [.1, .2, .5, 1, 2, 5, 10, 50, 100]

// Current tic values for both X and Y axis
property int xTicValue: 1
property int yTicValue: 1
property int axisLineWidth: 4
property int ticLineWidth: 2
property int ticLength: 300

// The pixel height and width of the drawn graph
property int graphHeight: 300;
property int graphWidth: 300;

// Where in the widget the 0,0 coordinate of the graph is
property int graphXStart: 100;
property int graphYStart: 400;

property string title: "Default Title"
property int minTitleSize: 6
property int minLegendSize: 4
property int minLabelSize: 4

property variant ymaxs: [];
property int maxValue: 100;
property int numSeconds: 10;
property int samplesPerSecond: 10;
property int numSamples: numSeconds * samplesPerSecond;

Component.onCompleted:
{
xTicValue = ticValue(numSeconds);
yTicValue = ticValue(maxValue);
}

//Timer
//{
// id: timeLineGraphTimer;
// interval: 5;
// repeat: true;
// running: true;

// onTriggered: timeLineGraphCanvas.myupdate();
//}

function newDataReceived(newData)
{
console.log("got here 1 - ", newData);
if(ymaxs.length > numSamples)
{
ymaxs.shift();
}
console.log("got here 2 - ", maxValue);

maxValue = newData;

if (maxValue == newData)
{
maxValue = newData;
//yTicValue = ticValue(maxValue); //<-- Any of these two
var value = ticValue(maxValue); //<-- methods will kill
yTicValue = value; //<-- this program
// ticValue(maxValue) //<-- Commenting the previous two
// lines and uncommenting this
// causes things to "run" great.
}
console.log("got here 3");

ymaxs.push(newData);
console.log("got here 4 : ", ymaxs[0]);

requestPaint();
console.log("got here 5");
}

function ticValue(maxValue)
{
var returnValue = 0;

console.log("ticValue");
for(var index = 0; index < ticMeasures.length; index++)
{
console.log(" ", index, " of ", ticMeasures.length);
returnValue = maxValue / ticMeasures[index];
console.log(" ", returnValue, " = ", maxValue, " / ", ticMeasures[index]);

if((returnValue >= 5) && (returnValue <= 10))
{
returnValue = ticMeasures[index];
break;
}
}

console.log("end ticValue");
return returnValue;
}
}
}

临时类.cpp

#include "tempClass.h"
#include <QtCore/QVariant>
#include <iostream>

tempClass::tempClass(QObject* object)
{
timeLineGraph = object;
}

void tempClass::onTimer()
{
std::cout << "onTimer() 1" << std::endl;
QMetaObject::invokeMethod(timeLineGraph, "newDataReceived", Qt::DirectConnection, Q_ARG(QVariant, QVariant::fromValue(5)));
std::cout << "onTimer() 2" << std::endl;
}

临时类.h

#ifndef TEMPCLASS
#define TEMPCLASS

#include <QtCore/QObject>

class tempClass : public QObject
{
Q_OBJECT

public:
tempClass(QObject* object);

public slots:
void onTimer();

private:
QObject* timeLineGraph;
};
#endif

主要.cpp

int main(int argc, char *argv[])
{
QApplication apps(argc, argv);

QQmlApplicationEngine engine;
engine.load(QUrl::fromLocalFile("main.qml"));

QObject* object = engine.rootObjects().value(0)->findChild<QObject*>("blargin")->findChild<QObject*>("timeLineGraphCanvas");

object->setProperty("title", "new title");

tempClass* tmp = new tempClass(object);

QTimer* timer = new QTimer();
timer->setInterval(100);
timer->setSingleShot(false);
timer->setTimerType(Qt::CoarseTimer);
timer->start();

QObject::connect(timer, SIGNAL(timeout()), tmp, SLOT(onTimer()));

return apps.exec();
}

在 QML 文件 TimeLIneGraph.qml 的函数 newDataReceived(newData) 中,我根据 ticValue 的返回值设置了 yTicValue 变量(最大值) 函数。这会导致程序内存泄漏而死掉。但是,如果我只是简单地调用该函数而不设置 yTicValue,则程序运行良好,但没有正确设置 tic 值的好处,因此有一个看起来很奇怪的图形。

我想我错误地调用了函数 newDataReceived 但我很困惑。如您所见,我在控制台上有一些输出语句,并且我总是希望看到每个输出。在这方面,两个围绕在tempClass::onTimer 中的调用。 Qt 说永远不要直接设置 QML 对象变量,因为它不会发出正确的信号。这是我收到的关于在 QML 和 C++ 之间调用或更改内容的唯一警告。

那么,问题是,有人知道为什么设置 yTicValue 变量会导致系统内存泄漏/使用十倍以上的内存然后死机吗?

最佳答案

好吧,经过一番思考,让我的思绪重新回到 Qt 游戏中,我意识到绘制请求是一个请求,而不是实际绘制的函数调用。这个问题在技术上是一个除以零的错误。然而,这是 QML 不会做的事情。 QML 代码不会在除以零时惨死,而是简单地返回 INF。因此,当我在绘制线程(未显示)中循环时,我从一个到 INF 并尝试绘制无限多的线条。

所以,我知道您想知道我在哪里得到零。 xTicValueyTicValue 都在 ticMeasures 数组中分配了一个值。这两个属性也是整数。因此,当 ticValue 函数正确返回值 .5 时,程序会将其截断为零。

所以,吸取教训。不要将异常、断言和崩溃之类的事情视为理所当然,否则你最终会像我一样脸红。

关于c++ - 从 C++ 设置变量时 QML 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35950164/

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