2009-08-13 14 views
2

これはかなり簡単な質問です。私はC++/CLIを使って小さなウィンドウフォームアプリケーションを書いています。フォームが初期化されると、私はいくつかのコードを処理するスレッドを開始します。スレッド内のコードが実行されると、スレッドのウィンドウの下部にあるステータスバーのテキストを何らかの形で更新します。だから私はこのようなことを考えていた:C++/CLIを使用してスレッドからステータスバーを更新してください

  1. 私はイベントを作成する。
  2. 次に、何らかの処理を行うスレッドを作成します。
  3. 処理が完了したら、ステータスバーのテキストを更新するイベントを発生させます。

これは合理的な方法ですか?もしそうなら、スレッド内からステータスバーを更新するには?おそらくこれを達成するよりスマートな方法がありますか?

答えて

3

それは、文字列与えられたステータステキスト変更のようなメソッドを宣言します。

private: void UpdateStatus(String^ msg) { 
    statusBar.Text = msg; 
} 

や他のスレッドから、Invokeを使用する:

Invoke(gcnew Action<String^>(this, &Form1::UpdateStatus), "message"); 

Invokeは、指定されたパラメータで指定したデリゲートを呼び出します。 UIスレッドで

+0

ありがとうございました。しかし、まず、コンパイラはForm1について苦情を申し立てました:UpdateStatusはFomr1のプライベートメンバーにアクセスできません。これはpublic:void UpdateStatus(String^msg)に変更することで解決しました。ただし、コンパイラはエラーC2440とエラーC3754(どちらもmsdnにあります)についてはまだ不平を言います。これに関するアドバイスは? –

+0

'Form1'を実際のクラス名に置き換えましたか?両方のメソッドをフォームクラス自体に追加していますか、他の場所に追加していますか(これらのスニペットをフォームクラス自体に追加することを前提としています)私はVS2008でこれをテストしました。 –

+0

Form1から別のクラスのインスタンスを作成します。 Form1がロードされると、クラスBのインスタンスが作成されます。クラスBのEntryPointでは、時間のかかる操作を実行します。これは次のようになります:私は、Bと呼ばれるクラスBのインスタンスを作成し、b→Start();を実行してForm1からスレッドを開始します。時間がかかる操作でbが完了すると、Form1のメンバーであるstatusBarのテキストを変更したいと考えています。私はこれが私が何をしようとしているのかを明確にしたいと思う。そしてまた、私はあなたがこのことについて私を助けるためにあなたの時間を入れていることに本当に感謝しています! –

関連する問題