0

チャットクライアントをモックアップしようとしています。まずはコードはこちら

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace thread
{
    class Program
    {

    public static Thread t1;
    public static Thread t2;
    public static bool flag;
    public static Random rand = new Random();

    static void Main(string[] args)
    {
        t1 = new Thread(first);
        t2 = new Thread(second);
        t1.Start();
        t2.Start();

        Console.Read();
    }

    public static void first()
    {

        string[] phrase = { "Hello", "random", "blah,blah", "computer", "Welcome", "This is chat bot" };
        while (!flag)
        {
            Thread.Sleep(4000);
            Console.WriteLine("{0}", phrase[rand.Next(6)]);
        }
    }

    public static void second()
    {
        string input = "";
        while (input!="x")
        {

            input=Console.ReadLine();
            if (input=="x")
            {
                break;
            }

        }
        flag = true;
    }


   }
}

このプログラムは自動的にコンソールにテキストを出力するので、メッセージを画面に書き込むこともできます。ここでの問題は、長い文を入力しているときはいつでも、入力に 4 秒以上かかるものがあることです。次に、自動化されたメッセージが次の行に出力される代わりに、入力しているものに追加されます。私はマルチスレッドに本当に慣れていないので、何が問題なのか正確にはわかりません。両方のスレッドが同じコンソール クラスを使用していると思います。

この点で助けていただければ幸いです。

4

3 に答える 3

2

コンソールにチャットクライアントを実装することは非常に困難です。それは可能ですが、それは決して些細なことではありません。

WinFormsなどのGUIベースの環境で実装する方がはるかに簡単です。この環境では、入力用と出力用の2つの完全に別個のテキスト領域を使用できます。

コンソールでこれを行うには、テストを表示する必要があるときはいつでも、カーソルを前の行に移動し、そのテキストを書き出してから、ユーザーが入力した場所にカーソルを戻す必要があります。ただし、これを行うと、前のテキスト行が上書きされるため、前の行のテキストをその前の行に書き込む必要があります。以下同様に、バッファの先頭に到達するまで続きます。完全に削除されます。その上、コンソールから情報を読み取ることはできないため、この全体の書き込みを実行できるように、メモリ内のすべてを追跡する必要があります。

WinFormですべてを実行する方が、はるかに簡単です。情報を書き出すには、出力テキストボックスのテキストに追加するだけです。情報を読み取るには、「送信」ボタンまたはEnterキーを押したときに、入力テキストボックスをクリアしてその内容を処理します。これら2つの間の相互作用について心配する必要はありません。

于 2012-10-30T20:06:21.383 に答える
1

を使用してチャットのようなアプリケーションを表現するのは実用的ではありませんConsole。実際に動作することを確認したい場合は、WinFormまたはアプリケーションを使用してみてください。コントロールを使用するなど、実際にチャットするなどWPFの形で多くのオプションがありますControlsfacebookListBox

明らかにこれは 1 つの方法ですが、 でそれを実現するのは非常に困難Consoleです。

于 2012-10-30T20:02:20.147 に答える
1

笑 2ez

    public static void WriteLineMultithread(string strt) {
        int lastx=Console.CursorLeft,lasty=Console.CursorTop;

        Console.MoveBufferArea(0,lasty,lastx,1,0,lasty+1,' ',Console.ForegroundColor,Console.BackgroundColor);
        Console.SetCursorPosition(0,lasty);
        Console.WriteLine(strt);
        Console.SetCursorPosition(lastx,lasty+1);
    }

このメソッドを使用すると、ユーザーが別のスレッドで「Console.ReadLine()」を使用している間にメッセージを書き込むことができます。チャット メッセージの受信は非同期であるか、別のスレッドで行われると想定しています。

lock(){} をいくつか追加できれば完璧です。

于 2016-01-14T09:03:15.503 に答える