Qt性能 - 避免崩溃

时间:2014-02-05 17:42:11

标签: performance qt crash

我的应用程序实时运行存在这样的问题。 它的价值是绘制两个图表。还要更新一些(8)QLabel并在窗口中显示它们。应用程序应运行很长时间并处理数据,因此我想以更快的速度对其进行测试,并将每个10ms的发送值设置为应用程序。当我启动应用程序时一切正常,但过了一段时间QLabel卡住或绘制图形卡住并在最终应用程序崩溃。

我想问一下10ms对于更新QLabel和图表(QCustomPlot)是否太快,这是导致程序崩溃的原因还是我需要在其他地方搜索问题?

void mainWnd::useDataFromPipe(double val) {

if(val<=*DOF) {
    FSOcounter=FSOcounter+1.0;

    lastRecievedFSO->saveValue(val);
    updateGraphMutex->lock();
    FSOvectorXshort->replace(1, FSOcounter);
    updateGraphMutex->unlock();

    if(!firstDataFSO()) {
        if(val>maximumRecievedFSO->loadValue()) maximumRecievedFSO->saveValue(val);
        else if(val<minimumRecievedFSO->loadValue()) minimumRecievedFSO->saveValue(val);
    }
    else {
       maximumRecievedFSO->saveValue(val);
       minimumRecievedFSO->saveValue(val);
    }
    numberOfRecievedValuesFSO->saveValue(numberOfRecievedValuesFSO->loadValue()+1.0);
}
else {
    RFcounter=RFcounter+1.0;

    lastRecievedRF->saveValue(val);
    updateGraphMutex->lock();
    RFvectorXshort->replace(1, RFcounter);
    updateGraphMutex->unlock();

    if(!firstDataRF()) {
        if(val>maximumRecievedRF->loadValue()) maximumRecievedRF->saveValue(val);
        else if(val<minimumRecievedRF->loadValue()) minimumRecievedRF->saveValue(val);
    }
    else {
       maximumRecievedRF->saveValue(val);
       minimumRecievedRF->saveValue(val);
    }
    numberOfRecievedValuesRF->saveValue(numberOfRecievedValuesRF->loadValue()+1.0);
}
}

其中saveValue()和loadValue()是

void infoLine::saveValue(double val) {
*value=val;
valueLabel->setText(QString("<b>%1</b>").arg(val));
}
double infoLine::loadValue(void) {
return *value;
}

1 个答案:

答案 0 :(得分:1)

你不是每10分钟“更新”一次标签,你只需要每隔10毫秒调用setText或类似的方法。标签将根据事件队列中的事件数量进行更新。只要您通过调用setText等“更新”标签,就可以了 - 这应该不是问题。

崩溃通常是由于内存错误造成的。内存错误通常可能是由于内存不足,双重释放或访问已释放的内存造成的。

由于内存不足,您所描述的内容似乎是内存错误。最微不足道的解释是你在泄漏记忆。这是一个简单的指针 - 智能指针(QScopedPointerQSharedPointer)将有助于此。

你可能也没有泄漏记忆,但是如果你确实进入了事件循环,就会过于递归。

您可能还错误地更新了窗口小部件,导致强制的,重复的,昂贵的重绘不会压缩成一次重绘。

您需要展示如何“更新”情节。虽然标签正确实现,并且对各种QLabel setXxxx方法的重复调用很便宜,但自定义绘图类可能只是错误地实现。

在Qt中更新小部件的惯用方法,也是唯一正确的方法是:

  1. 设置一些数据成员。

  2. 致电update()

  3. 这就是QLabel::setText内部所做的事情,也是任何其他窗口小部件应该做的事情。此功能应该以类似setXxxx的方式公开,并且是一个实现细节,尽管是一个重要的细节。小部件的用户不需要知道它。

    更新事件将发布到窗口小部件并进行压缩,这样重复更新而不返回事件循环只会导致一次重绘。

    如果没有看到自包含的 minimal 示例,真的很难说。通过最小化我的意思是 nothing 与此问题无关,应留在。