我有一些执行计算的C ++代码,我希望将其可视化。 我正在使用Windows窗体(.NET)。 我们的想法是在C ++中执行计算并将.h与图表包含在一起。 由于我需要快速更新,我使用计时器。由于我的数据是在C ++中,我应该使用一些技巧从.h中绘制它。我被建议使用BeginInvoke()方法,这是我的标题中的原型代码:
System::Void ActionD ()
{
for (pts = 0; pts < arrlength; pts++) {
chart1->series1->Points->AddXY(test_array_x[pts], test_array_y[pts]);
}
}
private:
System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e) {
MethodInvoker^ mi = gcnew MethodInvoker(this,&ActionD);
chart1->Invoke(mi);
//check if timer works:
Beep(300,500);
}
我有一些错误:“... MethodInvoker:委托构造函数需要1个参数” 问题是代码的一般概念是否正确以及如何修复该错误?
答案 0 :(得分:1)
旧版本VS中的C ++ / CLI编译器不会对错误的委托构造函数调用产生非常好的诊断。问题在于&amp; ActionD,它需要是一个完全限定的方法名称,如下所示:
MethodInvoker^ mi = gcnew MethodInvoker(this, &Form1::ActionD);
如有必要,将“Form1”替换为表单类的名称。
不,一般概念不正确。您正在使用常规的Winforms计时器,因为代码已经在主线程上运行,所以根本不需要使用BeginInvoke。你也不会通过使用异步计时器类来领先,它不会使代码更快。
您可以通过过滤数据来快速制作图表,只保留实际需要的系列中的点以获得准确的图表。哪个不占很多分,几百到一千就绰绰有余。监视器没有很多像素,因此使用数千个只会使Chart控件忙碌而没有任何好处。在工作线程中进行过滤是获得成功的方法。
答案 1 :(得分:0)
我发现了一个类似的主题: How can I update data in a chart in execution time (in C++ builder)?
所以我在我的计时器中这样做:
System :: Windows :: Forms :: DataVisualization :: Charting :: Series ^ seriezz1 = chart1-&gt; Series [0]; seriezz1-&gt; Points-&gt; AddXY(test_array_x [pts],test_array_y [pts]);
它编译,但在开始时崩溃:(