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 を使用する必要はまったくありません。また、非同期タイマー クラスを使用しても、コードが速くなることはありません。

正確なチャートを描画するために実際に必要なシリーズのポイントのみを保持して、データをフィルタリングすることでチャートを高速化します。それほど多くのポイントは必要ありません。数百から 1000 で十分です。モニターには多くのピクセルがないため、何千ものピクセルを使用すると、Chart コントロールが忙しくなり、何のメリットもありません。ワーカー スレッドでそのフィルタリングを行うことが、前進する方法です。

于 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 に答える