2012-05-11 6 views
3

最初に起動し、7日ごとにWebからいくつかのファイルをダウンロードするアプリケーションがあります。Cでスレッドが実行されている間にGUIでメッセージを表示

このアップデートには、ダウンロードが必要なファイルの数に応じて最大5分かかることがあります。

私が考えていることは、アップデートが処理されている間、残りのGUIを使用できるように、別のスレッドでアップデートを実行することです。

これは私のアプリケーションでは非常に実行可能なオプションのようですが、メインのGUIにメッセージを表示することもできます。ステータスバーにメッセージが表示され、更新が処理中であることをユーザーに知らせて終了します。

私はこれを行う方法を探し回っていますが、私が探している解決策として何も出現しないようです。これが可能かどうか誰にも分かりますか?

+2

['BackgroundWorker'コンポーネント](http://msdn.microsoft.com/en-us/library/system.comp) onentmodel.backgroundworker.aspx)。 –

+0

私たちはそれを上に構築できるようにコードを教えてください!それ以外の場合は一般的な回答を得るでしょう;) – banging

答えて

6

バックグラウンドスレッドからのDispatcher.Invokeコールで、UIにアクセスするコードをラップするだけです。使用するDispatcherインスタンスは、UIElementDispatcherプロパティから取得できます。この小さな男と

private void ProcessItems(IList<Item> items) 
{ 
    Task.Factory.StartNew(() => 
    { 
     for (int i = 0; i < items.Count; ++i) 
     { 
      // Code here runs on background thread. 
      this.ProcessItem(items[i]); 

      this.Dispatcher.Invoke(DispatcherPriority.Normal,() => 
      { 
       // Code here runs on UI thread. 
       this.UpdateStatus("Completed " + (i + 1) + " of " + items.Count); 
      }); 
     } 
    }, 
     TaskCreationOptions.LongRunning); 
} 
+0

はい、今日のGUIはWPFでなければなりません。 –

+0

@HenkHolterman:またはSilverlight :-p – Douglas

0

:以下の方法はあなたのUI要素のクラス定義内で定義されると仮定すると

勝利フォームの世界で(

internal static class ControlExtensions 
{ 
    internal static void Invoke(this Control control, Action action) 
    { 
     control.Invoke(action); 
    } 
} 

はあなたのコードで呼び出すことができ、WPF独自のソリューションを持っています):

... form.Invoke(()=>form.SomeControl.SomeProperty=someValue); 
関連する問題