2016-05-17 8 views
0

C#とC++の混合プログラミングが初めてです。C#を使用したC++からのC++プログレスバーの更新管理されたC++を使用した更新

私のC#アプリケーションにはProgressBarがあります。ボタンをクリックすると、C++/CLIラッパークラスDLLを介してC++関数が呼び出されます。それは時間のかかる機能です。したがって、私はC#アプリケーションのProgressBarで状態の更新を表示したいと思います。

UIをブロックするべきではないため、背景作業者が使用されます。そのDoWorkでは、私はDLLメソッドを呼び出します。コードで提案してください。

[私が得た一つの手がかりは、私は、デリゲートを使用する必要があるが、私はそれ故にC++/CLIに行うことができない新しいです。]

コードスニペットが大幅に役立ちます。

答えて

0

プログレスバーを更新するマネージメソッド(C#またはC++/CLI)が必要です。このメソッドは、パラメータとしてパーセントを使用します。マネージメソッドは、必要なスレッドを処理します。おそらくUIスレッドに呼び出す必要があります。

これをC++関数ポインタに変換し、長時間実行しているC++関数に渡します。長時間実行しているC++関数が関数ポインタを定期的に呼び出すようにしてください。

ここではBackgroundWorkerを使用できますが、私はそれを個人的にスキップします。すべての機能を正しく機能させるには、多くの配管工事を行う必要があります。関心のあるものすべてが進捗状況を報告している場合は、直接行うのが簡単です。代わりに、私はダイレクトパスをとって、ちょうど新しいThreadでC++メソッドを呼び出します。ここで

+0

はあなたの提案のために、デビッド・ヨー、ありがとうございました。はい、私は%completeを扱うためのパラメータを取るManagedメソッドを持っています。また、長時間実行するためのパラメータを持つこともできます。しかし、私はいくつかの小さなスニペットを共有することができれば感謝します。 – user5579704

+0

これを実装する際に手を入れてください。具体的な問題がある場合は、具体的に質問を投稿してください。この種の問題には、一般的なヘルプがたくさんあります。 –

0

は、ここではイベント

C++: 

int progressvalue; 

extern "C" __declspec(dllexport) void __cdecl LongRunningMethod(int seconds) 
{ 
    cout << "Started" << endl; 

    progressvalue = 0; 
    for (size_t i = 0; i < seconds; i++) 
    { 
     std::this_thread::sleep_for(std::chrono::milliseconds(1000)); 
     progressvalue = (seconds - ((double)seconds/ (double)i))*10; 
     cout << "Progress value in c++: " << progressvalue << endl; 
    } 
    cout << "Completed" << endl; 
} 

extern "C" __declspec(dllexport) int __cdecl GetProgressUpdate() 
{ 
    return progressvalue; 
} 

せずにそれを行うに簡単な方法は、C# C#で、それを消費する方法である:

private void button_Click(object sender, RoutedEventArgs e) 
{ 
     var task = Task.Factory.tartNew(() => { 
           NativeMethods.LongRunningMethod(10);}); 

    Task.Factory.StartNew(() => 
    { 
     while (!task.IsCompleted) 
     { 
      Dispatcher.Invoke(() => 
      { 
       var val = NativeMethods.GetProgressUpdate(); 
       ProgressBarMain.Value = val; 
       Thread.Sleep(100); 
      }); 
     } 
    }); 
} 
+0

ありがとうございます。 C#、ラッパー、C++の組み合わせでManaged C++/cliのバージョンを手助けできますか?私は新しいので、それは要求です。 – user5579704

関連する問題