我的应用程序实时运行存在这样的问题。 它的价值是绘制两个图表。还要更新一些(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;
}
答案 0 :(得分:1)
你不是每10分钟“更新”一次标签,你只需要每隔10毫秒调用setText
或类似的方法。标签将根据事件队列中的事件数量进行更新。只要您通过调用setText
等“更新”标签,就可以了 - 这应该不是问题。
崩溃通常是由于内存错误造成的。内存错误通常可能是由于内存不足,双重释放或访问已释放的内存造成的。
由于内存不足,您所描述的内容似乎是内存错误。最微不足道的解释是你在泄漏记忆。这是一个简单的指针 - 智能指针(QScopedPointer
和QSharedPointer
)将有助于此。
你可能也没有泄漏记忆,但是如果你确实进入了事件循环,就会过于递归。
您可能还错误地更新了窗口小部件,导致强制的,重复的,昂贵的重绘不会压缩成一次重绘。
您需要展示如何“更新”情节。虽然标签正确实现,并且对各种QLabel setXxxx
方法的重复调用很便宜,但自定义绘图类可能只是错误地实现。
在Qt中更新小部件的惯用方法,也是唯一正确的方法是:
设置一些数据成员。
致电update()
。
这就是QLabel::setText
内部所做的事情,也是任何其他窗口小部件应该做的事情。此功能应该以类似setXxxx
的方式公开,并且是一个实现细节,尽管是一个重要的细节。小部件的用户不需要知道它。
更新事件将发布到窗口小部件并进行压缩,这样重复更新而不返回事件循环只会导致一次重绘。
如果没有看到自包含的 minimal 示例,真的很难说。通过最小化我的意思是 nothing 与此问题无关,应留在。