使用 wxMathPlot 显示以 100 Hz 更新的数据的实时图表是可行的。
以下是使用三个 wxMathplot 实例的应用程序的屏幕截图,均显示以 128Hz 更新的数据
如果您想要一种实时图表,其中旧数据在左侧消失,而新数据出现在右侧,但显示的数据量在最后 10 秒是恒定的,那么 mpFXYVector 很尴尬使用。有关如何处理此问题的讨论,请参阅this answer.
但是,对于第一次通过,这个框架应该让你开始
... in Myframe constructor
vector <double> xs, ys;
mpFXYVector * data_layer
mpWindow * graph;
// initialize
...
// Set up 100 Hz timer
...
MyFrame::OnTimer( ... )
{
// add new data point(s)
...
// copy data into layer
data_layer.SetData(xs,ys);
// redraw
graph->Fit();
/* Note that at this point we have requested a redraw
But it hasn't taken place yet
We need to return so that the windows system can update the screen etc
We will back in 1/100 sec to do it all again.
*/
}
那么,现在的问题是,我们能以多快的速度完成这个计划?我已经尝试了一个计时器事件处理程序,它只是跟踪它被调用的次数。
void MyFrame::OnTimer2(wxTimerEvent& )
{
static int ticks = 0;
ticks++;
static clock_t start;
if( ticks == 1 ) {
start = clock();
}
if( ticks == 1000 ) {
double duration = (double)(clock() - start) / CLOCKS_PER_SEC;
wxMessageBox(wxString::Format("1000 ticks in %f secs\n",duration));
myTimer->Stop();
return;
}
}
在功能强大的桌面上,我能做到的最快速度是 66 Hz。
这有关系吗?
恕我直言,它没有。人眼无法欣赏以 100Hz 更新的图形。重要的是,图表显示的是在 100Hz 下采集的数据,没有任何损失或滞后,但图表显示不需要如此频繁地更新。
因此,在生成此答案顶部屏幕截图的应用程序和我开发的其他类似应用程序中,图表以 10Hz 更新,wxWidgets 框架可以轻松维护,数据采集发生在在另一个线程或进程中的频率要高得多。图形显示代码每秒十次复制同时获取的数据并更新显示。