2011-12-27 15 views
1

私はいくつかのC#のコードを書いて、それは私がそれを開始するところから私のGUIをフリーズdoes notのように、そこに私が独自のスレッドでそれを置くことによって、クラスを開始:スレッディング構造

これは私のフォームクラスからです。

Execute_Recipe execute; 
    execute = new Execute_Recipe(XCoordinatesList, YCoordinatesList, Zref, Voltref, 
       widget, record, filename); 
    Thread executethread = new Thread(new ThreadStart(execute.RunRecipe)); 

私の実行クラスでは、データを記録するための新しいクラスを作成します。これは私の実行クラスからです:

record1 = new Record_Recipe(XCoordinateList1, YCoordinateList1, Zref1, Voltref1, filename1); 

最後に私のレコードクラスでは、私は新しい形式にデータを送信します。表示される。ですから、私が開始するすべてのサブクラスは、このスレッド内ですべて作成されます。私は構造が絶対に狂っている知っている、ソフトウェアは開発段階の深いですが、ここで私の質問です:

私の手続きのすべての実行と記録独自のスレッドで?

実行のスレッドを1つ、録画のスレッドを1つ、表示用のバックグラウンドワーカーを作成しますか?スレッド間で話す? (スレッド間の会話が簡単ではないことを理解しているからです)

私は中間的なプログラマーですが、この問題を解決することができれば幸いです。スレッド間で話す

答えて

1

は、C#で非常に簡単ですコンストラクトの

  yourform.BeginInvoke((MethodInvoker)delegate() 
      { 
       yourform.button.Text = "new label"; 
       //More stuff here 
      }); 

種類は、更新されたUIスレッドにワーカースレッドから使​​用することができます。より寿命の短い非UIスレッドをたくさん作成する場合は、代わりにThreadPoolを使用することを検討してください。

簡単なuiの更新については、INotifyPropertyChangedも参照してください。これにより、データバインドされたコントロールを簡単に更新できます。

+0

私はこれを自分の表示フォームで使用しますか? – kenetik

+0

コードスニペットは、非UIスレッドから更新されたUIに使用される例ではありません –

+0

ああ、私はちょうど助けてくれたcodeprojectsのbeginInvokeメソッドでいくつかの読書をしました!ありがとう! – kenetik

0

あなたがApplication.Run()と呼んでいるスレッドは、すべてのGUI処理を行わなければならないスレッドです。 Windows.Forms.Controlベースクラスは、Invoke()メソッドを持ち、GUIスレッドがアイドル状態になるたびにデリゲートを呼び出すことができます(FormControlです)。 .NETには、スレッド間で通信するための他のメカニズムがいくつかあります。

GUI以外のスレッドと通信するのは少し慣れていますが、かなりのオプションがあります。例次のようにWaitHandleである使用、例えば:スレッドの送信信号

  • ためのスレッドが待機を受信

    • 送信スレッドセットはスレッドがデータを読み取る受信
    • 信号データを書き込み、タスクを実行

    通常、1つのスレッド(「メインスレッド」)が進み、他のスレッド(主スレッド)が進みます。作成されたスレッドは、後で処理され、破棄されます。

    MSDNのSystem.Threading名前空間を確認し、入手可能なものを確認することをお勧めします。また、http://www.albahari.com/threading/はそれをすべてカバーしているようです。