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

在控制台中实现聊天客户端非常困难。这是可能的,但这一点也不简单。

在基于 GUI 的环境中实现它要容易得多,例如 winforms,您可以在其中拥有两个完全独立的文本区域,一个用于输入,一个用于输出。

为了在控制台中执行此操作,您需要在需要显示测试时将光标向上移动到上一行,写出该文本,然后将光标移回用户输入的位置。但是这样做会覆盖上一行文本,因此需要将上一行文本写在之前的行上,依此类推,直到到达缓冲区的顶部,该行可以被完全删除。最重要的是,您无法从控制台读取信息,因此您需要跟踪内存中的所有内容,以便您可以完成整个写入操作。

在 winform 中做所有事情要容易得多。要写出信息,只需将其添加到输出文本框中的文本中,要读取信息,当按下“发送”按钮或回车时,只需清除输入文本框并处理其内容。您无需担心这两者之间的交互。

于 2012-10-30T20:06:21.383 回答
1

使用Console. 如果您真的想看到它在尝试使用WinFormWPF应用程序时工作,那么您有很多选项Controls可以显示,例如使用控件等facebook进行聊天。ListBox

显然这是一种方法,但在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 回答