gpt4 book ai didi

c++ - 多线程绘图不流畅怎么解决?

转载 作者:行者123 更新时间:2023-11-28 01:21:16 27 4
gpt4 key购买 nike

我用Qt写了一个数据采集程序。我使用 QSemphore 编写的双缓存区域的子线程收集数据。

void QThreadShow::run() {
m_stop=false; // when start thread,m_stop=false

int n=fullBufs.available();
if (n>0)
fullBufs.acquire(n);

while (!m_stop) {
fullBufs.acquire(); // wait fo full buffer
QVector<double> dataPackage(BufferSize);
double seq=bufNo;
if (curBuf==1)
for (int i=0;i<BufferSize;i++){
dataPackage[i]=buffer2[i]; // copy data from full buffer
}
else
for (int i=0;i<BufferSize;i++){
dataPackage[i]=buffer1[i];
}

for (int k=0;k<BufferSize;k++) {
vectorQpointFbufferData[k]=QPointF(x,dataPackage[k]);
}
emptyBufs.release(); // release a buffer
QVariant variantBufferData;
variantBufferData.setValue(vectorQpointFbufferData);
emit newValue(variantBufferData,seq); // send data to main thread
}
quit();
}

当一个子线程的缓存采集到500条数据后,将数据输入到一个QVector中,发送给主线程,每20ms直接分配给qchartview中的一个lineseries进行绘制。我使用 QtChart 绘制数据图表。

void MainWindow::onthreadB_newValue(QVariant bufferData, double bufNo) {
// Analysis of QVariant data
CH1.hardSoftDataPointPackage = bufferData.value<QVector<QPointF>>();
if (ui->CH1_Source->currentIndex()==0) {
for (int p = 0;p<CH1.hardSoftDataPointPackage.size();p++) {
series_CH3->append(CH1.hardSoftDataPointPackage[p]);
}
}
}

主线程中有定时器,间隔20ms,有双倍时间(时间=时间+1),控制X轴。

void MainWindow::drawAxis(double time) {
// dynamic draw x axis
if (time<100) {
axisX->setRange(0, TimeBase/(1000/FrameRate) * 10);
// FrameRate=50
} else {
axisX->setRange(time-TimeBase/(1000/FrameRate) * 10, time);
}
}

但是我在运行我的程序的时候出现了一个问题,就是子线程每次给主线程发送数据的时候,主线程卡了几秒,剧情也卡了几秒。我在从主线程获取数据的主线程中添加了一条曲线,发现两条曲线会同时卡住。我不知道如何解决这个问题。

此外,我希望主线程在20ms内均匀地从子线程中提取数据,而不是一次绘制所有点。

最佳答案

您的主线程卡住了,因为您一次复制(添加到系列)大量数据。相反,您可以在不发出信号的情况下收集线程实例中的所有数据。并且从主线程中每 20 毫秒获取少量收集的数据。

像这样:

while(!m_stop)
{
...
//QVariant variantBufferData;
//variantBufferData.setValue(vectorQpointFbufferData);
//emit newValue(variantBufferData,seq);//send data to main thread

//instead this just store in internal buffer
m_mutex.lock();
m_internalBuffer.append(vectorQpointFbufferData);
m_mutex.unlock();
}

读取方法

QVector<QPointF> QThreadShow::takeDataPiece()
{
int n = 4;
QVector<QPointF> piece;
piece.reserve(n);
m_mutex.lock();
for (int i = 0; i < n; i++)
{
QPointF point = m_internalBuffer.takeFirst();
piece.append(point);
}
m_mutex.unlock();
return piece;
}

然后在主线程中读取超时槽

void MainWindow::OnDrawTimer()
{
QVector<QPointF> piece = m_childThread.takeDataPiece();
//add to series
...
//drawAxis
...
}

关于c++ - 多线程绘图不流畅怎么解决?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56160118/

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