私はTCPサーバーアプリケーションを持っており、TCPクライアントと通信するためのスレッドを持っています。クライアントからデータを受け取ると、このデータを使って新しいフォームを作成したいが、スレッドでフォームを作成することはできない。ボタンクリックイベントを使用してフォームを簡単に作成できます。C#新しいフォームをスレッドで作成する
どこが間違っていますか?
ありがとうございます。
私はTCPサーバーアプリケーションを持っており、TCPクライアントと通信するためのスレッドを持っています。クライアントからデータを受け取ると、このデータを使って新しいフォームを作成したいが、スレッドでフォームを作成することはできない。ボタンクリックイベントを使用してフォームを簡単に作成できます。C#新しいフォームをスレッドで作成する
どこが間違っていますか?
ありがとうございます。
新しいフォームを作成するためにGUIスレッドにコンテキストを変更する必要があります。どこかでBeginInvoke()を行う必要があります。
これはどの種類のサーバーですか?リスニングスレッドが1つの「クラシック」同期サーバーと、クライアント接続ごとにサーバー<>クライアントスレッドです。
クライアント接続時にフォームを作成したくない場合は、接続されたクライアントが具体的に尋ねる場合にのみこのフォームを作成します。
仕事をするためのサンプルコード:
private void Button1_Click(object sender, EventArgs e)
{
Thread t1 = new Thread(StartMe);
t1.Name = "Custom Thread";
t1.IsBackground = true;
t1.Start();
}
private void StartMe()
{
//We are switching to main UI thread.
TextBox1.Invoke(new InvokeDelegate(InvokeMethod), null);
}
public void InvokeMethod()
{
//This function will be on main thread if called by Control.Invoke/Control.BeginInvoke
MyForm frm = new MyForm();
frm.Show();
}
VBからC#にコードを変換してみてください。 –
言語を変換するにはhttp://www.developerfusion.com/tools/convert/vb-to-csharp/を使用してください –
-1。事実上間違っている。私はしばしばそれを見ます - 申し訳ありません - プログラマーは話を何も知らない。 ANYスレッドは、ディスパッチャーを実行するときにongとしてフォームを開くことができます。それを作成するのは簡単です。私はここでは、メインのウィンドウ(それらのうちの8つは時々重いデータ処理を行う)を実行するごとに1つのスレッドを持っているアプリを持っている。 http://stackoverflow.com/questions/4698080/spawn-a-new-thread-to-open-a-new-window-and-close-it-from-a-different-threadにはコード例があります。フォーム作成メソッドはフォームを開き、ディスパッチャを実行します。簡単。 – TomTom
@TomTom - もちろん、他のスレッドはUIスレッド、ウィンドウの作成、メッセージの取得/送信が可能です。できない場合は、1つのプロセスしかありません:)この場合、クライアントスレッドwoldはメッセージを処理するディスパッチャを実行する必要があります。ブロッキングコールを行う必要がない場合は問題ありません。 OPケースでは、クライアントごとにGUIスレッドを実行するのが良いかどうかはわかりません。 –
私も。しかし、それはポイントではありません - 答えは単に間違っていました。「THE」スレッドのみがフォームを作成できることを示しています。 – TomTom