0

マルチスレッドは初めてです

異なるスレッドで実行したい2つの機能があります(知っておく必要がある場合、それらは異なるポートへの2つのTCPソケット接続であり、1つはサーバーとして機能し、もう1つはクライアントとして機能します)

最初: メイン フォームのテキスト ボックスにアクセスするにはどうすればよいですか? 非静的メンバーにアクセスできず、非静的関数でスレッドを作成できません

2番目:実行中に関数にデータをプッシュするにはどうすればよいですか?

私はこれに間違った方法でアプローチしている可能性があります。とにかく、これは私のコード構造です (簡素化するために数行削除されています)

namespace WindowsFormsApplication4
{
    public partial class Form1 : Form
    {
    Thread lis = new Thread(new ThreadStart(Listen));
    Thread con = new Thread(new ThreadStart(Connect));
    public Form1()
    {
        InitializeComponent();
        lis.IsBackground = true;
        con.IsBackground = true;
    }

    static void Connect()
    {
        //try to connect to 127.0.0.1:10500
            while (true)
            {
                //listen and output to Form1.txtControlMessages
                //input from Form1.txtCommandToSend and write to the stream

            }
    }
    static void Listen()
    {
        try
        {
            //start listen server on port 10502
            while (true)
            {
                //accept client and output to Form1.txtData
            }
        }
        catch (SocketException e)
        {
        }

    }
}
4

1 に答える 1

2

非静的関数を実行するスレッドを作成できます。コードの問題は、インスタンスを作成する前に、クラス フィールドであるスレッド インスタンスがインスタンス変数/メソッド (ConnectおよびListen) で初期化されていることです。

これを修正するには、変数をクラス レベルで定義し、コンストラクターで初期化します。

Thread lis;
Thread con;

public Form1() {
  InitializeComponent();

  lis = new Thread(Listen);
  con = new Thread(Connect);

  lis.IsBackground = true;
  con.IsBackground = true;
}

また、UI スレッドが所有するコントロールには、他のスレッドからアクセスできないことに注意してください。アプリで使用する必要がありControl.BeginInvokeます。WinForms

private void Connect() {
  // ....

  txtCommandToSend.BeginInvoke(new Action(() => {
    txtCommandToSend.Text = "your string";
  }));

  // ....
}

2番目の質問です。実行中に関数にデータをプッシュするという意味がわかりません。スレッドが開始されると、関数にデータをプッシュすることはできません。ただし、他のスレッドで実行されている関数内からインスタンス変数を使用することはできます。ただし、これらの変数が複数のスレッドからアクセスされる場合は、注意が必要であり、これらの変数に対して適切なロックを使用する必要があります。

于 2013-05-30T04:51:41.237 に答える