這是一個監測專案,每秒通過串口接收100個資料進行處理(100Hz),為了避免出現卡頓我將串口接收都放到了一個子執行緒1中,串口接收執行緒1接收到來自采集設備的資料后,通過信號發送給資料處理執行緒2,同時發送給UI上的曲線圖做動態更新。資料處理執行緒接收100個資料點并壓入一個QVector中,再進行處理得到結果,將結果通過信號發送給UI上的tableview和條形圖進行重繪顯示,同時將結果發送給資料庫保存執行緒3進行保存。
現在問題是,QT中關于界面的操作只能在主執行緒中進行,相關復雜重要的操作我都放入相關子執行緒了,但是由于資料量較大、頻繁(以后可能要做1000Hz),主界面在運行一段時間后出現曲線圖動態更新卡住,讓tableview更新完曲線圖才能動的情況。大佬們有什么好辦法能解決主界面上需要頻繁更新并且流暢的方法嗎?還是我的曲線圖、條形圖、tableview更新方法不對?求指教,畢業設計快要交了!
這是程式截圖

這是曲線圖更新代碼
//更新資料函式,洗掉第一個元素,尾部添加新的元素
void STRESS::lineChartUpdate1P(qreal data)
{
switch (refreshMode)
{
case 0://連續重繪
static int num=0;
if(refreshFlag==true)
{
mySeries->clear();
refreshFlag=false;
}
if(mySeries->count()<xMax)//還不夠x軸范圍,就先增加點
{
mySeries->append(num,data);
num++;
}
else
{
mySeries->remove(0);//洗掉第一個元素
mySeries->append(0,data);//尾部添加新的元素(0,data) 0是隨意的,因為下面要重新排列x坐標
//更新點x坐標
for(int i=0;i<mySeries->count();i++)
{
mySeries->replace(i,i,mySeries->at(i).y());
}
}
break;
case 1:
if(refreshFlag==true)
{
mySeries->clear();
refreshFlag=false;
}
static int num2=0;
if(num2<=xMax)
{
mySeries->append(num2,data);
num2++;
}
else if(num2==xMax+1)
{
mySeries->clear();
num2=0;
}
else{}
break;
default:
break;
}
}
這是條形圖更新代碼:
void STRESS::updateBarChart(QVector<qreal> *AMP)
{
QApplication::processEvents();
myBarChart->removeAllSeries();//洗掉所有序列
myBarChart->removeAxis(myBarChart->axisX());//洗掉X軸
myBarChart->removeAxis(myBarChart->axisY());//洗掉Y軸
QBarSet *setAmp=new QBarSet("AMP");//
QStringList barCateGories;
for(int i=0;i<AMP->count();i++)
{
setAmp->append(AMP->at(i));//添加資料
barCateGories<<QString::number(i);
}
QBarSeries *series=new QBarSeries();
series->append(setAmp);
QBarCategoryAxis *X=new QBarCategoryAxis();
X->append(barCateGories);
myBarChart->setAxisX(X,series);
myBarChart->addSeries(series);
}
這是tableview更新代碼:
void STRESS::updateTable(QVector<qreal> *AMP, QVector<qreal> *AVG, QVector<qreal> *ultraStress, QVector<qreal> *Modified, QVector<qreal> *Damage)
{
if(theModel->rowCount()<AMP->count())
{
theModel->setRowCount(AMP->count());//設定列數等于幅值點個數
}
for(int i=0;i<AMP->count();i++)
{
aItem=new QStandardItem(QString::number(AMP->at(i)));
aItem->setTextAlignment(Qt::AlignHCenter);
aItem->setForeground(QBrush(QColor(83,194,60)));
aItem->setFont(QFont("Microsoft YaHei",10,QFont::Black));
theModel->setItem(i,0,aItem);//設定幅值
aItem=new QStandardItem(QString::number(AVG->at(i)));
aItem->setTextAlignment(Qt::AlignHCenter);
aItem->setForeground(QBrush(QColor(83,194,60)));
aItem->setFont(QFont("Microsoft YaHei",10,QFont::Black));
theModel->setItem(i,1,aItem);//設定均值
aItem=new QStandardItem(QString::number(ultraStress->at(i)));
aItem->setTextAlignment(Qt::AlignHCenter);
aItem->setForeground(QBrush(QColor(245,211,111)));
aItem->setFont(QFont("Microsoft YaHei",10,QFont::Black));
theModel->setItem(i,2,aItem);//設定極限應力
aItem=new QStandardItem(QString::number(Modified->at(i)));
aItem->setTextAlignment(Qt::AlignHCenter);
aItem->setForeground(QBrush(QColor(0,120,215)));
aItem->setFont(QFont("Microsoft YaHei",10,QFont::Black));
theModel->setItem(i,3,aItem);//設定修正后應力
aItem=new QStandardItem(QString::number(Damage->at(i)));
aItem->setTextAlignment(Qt::AlignHCenter);
aItem->setForeground(QBrush(QColor(255,0,0)));
aItem->setFont(QFont("Microsoft YaHei",10,QFont::Black));
theModel->setItem(i,4,aItem);//設定損傷度
}
}
求大佬們幫我看看!
uj5u.com熱心網友回復:
如果是因為曲線圖要等待tableview的重繪,那么就是tableview的處理效率不夠高,我看你重繪函式里一直不斷的創建變數,這些變數本身負荷就比較大,你看看能否把這個給優化一下,減少物件的創建。如果還是不行的話,我建議不要使用tableview,因為你只是想顯示一下通過表格來顯示一下資料的話,tableview其實還攜帶了許多你不需要的操作,正是因為這些操作導致你表格的效率低下,你完全可以畫一個表格出來,這樣性能可以大幅度提升,另外不太清楚你是怎樣來繪制曲線的,是否曲線的繪制沒處理好,導致卡頓的uj5u.com熱心網友回復:
paintEvent里面執行的東西太多轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/45595.html
標籤:Qt
