1

我有一些执行计算的 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 个参数”问题是代码的一般概念是否正确以及如何修复该错误?

4

2 回答 2

1

旧版本的 VS 中的 C++/CLI 编译器不会对错误的委托构造函数调用产生很好的诊断。问题在于 &ActionD,它必须是完全限定的方法名称,如下所示:

 MethodInvoker^ mi = gcnew MethodInvoker(this, &Form1::ActionD);

如有必要,将“Form1”替换为您的表单类的名称。

不,一般概念是不正确的。您正在使用常规的 Winforms 计时器,根本不需要使用 BeginInvoke,因为代码已经在主线程上运行。使用异步计时器类也不会领先,它不会使代码更快。

您可以通过过滤数据来快速制作图表,只保留您实际需要的系列中的点来绘制准确的图表。分数不高,几百上千就绰绰有余了。监视器没有很多像素,因此使用数千个像素只会使图表控件忙碌而没有任何好处。在工作线程中进行过滤是取得成功的方法。

于 2013-11-08T09:20:57.390 回答
0

我发现了一些类似的主题: 如何在执行时更新图表中的数据(在 C++ 构建器中)?

所以我在我的计时器内这样做:

System::Windows::Forms::DataVisualization::Charting::Series^ seriezz1 = chart1->Series[0]; seriezz1->Points->AddXY(test_array_x[pts], test_array_y[pts]);

它编译,但在开始时崩溃:(

于 2013-11-11T11:03:07.437 回答