2011-07-30 16 views
0

リモートインストールを実行するプログラムを作成したい。それぞれのインストールの開始時にウィンドウを起動し、ジョブの進捗状況を示す進行状況バーを表示したいと考えています。マルチスレッドのマルチウィンドウアプリケーションが動作しない

メインスレッドからウィンドウを作成すると、そのすべての要素にアクセスできますが、実際にインストールを実行するタスクのために応答しません。私が新しいスレッドでウィンドウを起動すると、メインスレッドがウィンドウ内のどの要素を認識するようにも見えないので、プログレスバーを更新できません。

どのように応答性の高いマルチスレッドUIを作成できますか?

+0

私は通常よりも重い編集をしましたが、チャタニーを取り除きました。私が残したことが実際の質問です。 –

+0

ところで、私はこれがWPFではなくWinFormsアプリケーションだと思いますか? –

答えて

0

2番目のスレッド(作業中)にUIを応答させ、2番目のスレッドからUIを更新できるようにするには、コントロールでInvokeを使用する必要があります。そこに利用可能ないくつかのコードスニペットがあります。ここで

は短い例です:How can I update my user interface from a thread that did not create it?

あなたはSO同様に、ここで例の数十を見つけることができます - ちょうど検索を行う:)

ここSO今日の別の同様の質問です - cross threading problem - コード例がありますが、答えのひとつで

0

他のスレッドから安全にUIコントロールにアクセスする簡単な方法 - ラムダをControl.BeginInvoke(lambda)メソッドで呼び出す方法があります。たとえば、1つのフォームとボタンがあるプログレスバーを持つWinFormsアプリケーションがあるとします。ボタンをクリックすると、別のスレッドでいくつかの架空の作業が進行中で、プログレスバーを更新する必要があります。同じ結果がBackgroundWorkerまたは他の技術を用いて達成することができますが、これは私のためとして最も簡単です

private void button1_Click(object sender, EventArgs e) 
{ 
    ThreadStart s =() => 
    { 
     for (int i = 0; i <= 10; i++) 
     { 
      Action a =() => progressBar1.Value = i * 10; 
      BeginInvoke(a); 
      Thread.Sleep(300); // imitate some workload 
     } 
    }; 
    var t = new Thread(s); 
    t.Start(); 
} 

:。最も簡単なのはそのような何かを書くことになります

関連する問題