2013-03-01 34 views
0

我是使用wxWidgets的新手,并且正在寻找连续的实时情节。我已经对可用于wxWidgets的实时(连续)绘图工具进行了一些研究。 我最感兴趣的是使用mxMathPlot进行绘图,支持mpFXYVector以点为单位。 (我知道有Numerix图书馆为好,但似乎有没有它多少文档)OpenGL与wxMathPlot在wxWidgets中进行实时绘图?

不过,我想办100更新第二?或100分新的点数。

这是可行的使用mxMathPlot与mpFXYVector,或者这种方法会太慢吗?

或者应该考虑OpenGL?

+0

你的显示器最好也至少做100Hz! – nmz787 2016-01-29 04:15:48

回答

1

使用wxMathPlot显示更新为100 Hz更新数据的实时图是可行的。

以下是使用三个应用程序的截图wxMathplot的情况下,即在128Hz

enter image description here

如果你想的那种实时曲线图,其中旧数据消失在更新所有显示的数据左边是新数据出现在右边,但是显示的数据量在最后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赫兹。

这有关系吗?

恕我直言,它没有。人眼无法欣赏以100Hz更新的图形。重要的是该图显示的是以100Hz采集的数据,没有任何损失或滞后,但图形显示不需要频繁更新。

因此,在制作此答案顶部的屏幕截图的应用程序以及我开发的其他类似应用程序中,图形以10Hz更新,wxWidgets框架无需维护,数据采集正在发生在另一个线程或进程中频率更高。图表显示代码每秒十次复制同时获取的数据并更新显示。

+0

太棒了!我其实看到了你的一些帖子,我想给你发个消息,所以我很高兴你回复。您使用MPFXYVector来帮助提供数据,对吗? – akvareli 2013-03-01 16:36:30

+0

我使用MPFXYVector – ravenspoint 2013-03-01 16:37:33

+0

好吧,太好了。非常感谢!我会开始挖掘它。只是想确保在做这件事之前我做出了正确的决定。 – akvareli 2013-03-01 16:40:33