0

プログラムのメインウィンドウであるmainFormというクラスがあります。このクラスにTextBox(このTextBox Logsプログラム)オブジェクトを作成し、それにプログラムステータスを書き込みたい。これはmainFormや他のオブジェクトから(TextBoxオブジェクトを渡すことで)簡単に実行できますが、別のスレッドから実行したい場合は複雑です。ただし、mainFormで定義されたコードを(デリゲートを使用して)実行するスレッドによってTextBoxに書き込んでいます。

私の質問は、別のクラスで実行されているスレッドからTextBoxに書き込む方法は?

public partial class mainForm : Form
{
   TextBox log = new TextBox();
   .
   .
   .
   OtherClass o = new OtherClass(log);
}
class OtherClass
{
   private TextBox log;
   public otherClass(TextBox aLog)
   {
      log = aLog;
      Thread thread = new Thrad(new ThreadStart(this.run));
      thread.Start();
   }
   private void run()
   {
      log.Text = "Message";// I Can't Do This. Can I Use Delegate Here? How?
   }
}
4

2 に答える 2

3

Invoke/を使用できますBeginInvoke

log.BeginInvoke(
    (Action)(() =>
    {
       log.Text = "Message";
    }));

これにより、セカンダリスレッドはGUIの変更をGUIスレッドに安全に転送できます。GUIスレッドはそれらを適用する必要がある唯一のスレッドです。

于 2012-08-23T13:19:45.970 に答える
1

定義されたデリゲートを使用する別の方法-ちなみに、ここでのXtは、署名が同じである限り、他のメソッドで再利用できます。パラメータを渡すこともできます-(Xtデリゲートにパラメータがあり、そのInvokeはそれぞれのコマ区切りリストを渡します。

private void run() 
    { 
          XteChangeText();
    } 

    private delegate void Xt();

    private void XteChangeText()
    {
        if (log.InvokeRequired)
        {
        Invoke(new Xt(XteChangeText));
        }
        else
        {
        log.Text="Message";
        }
    }
于 2012-08-23T14:56:39.963 に答える