Форма ломается после открытия - PullRequest
2 голосов
/ 21 октября 2019

Я не могу понять, почему моя форма победы зависает, когда начинается бесконечное время. Как я могу это исправить? когда нет времени, кажется, работает. Я пытался делать это с событиями, но без вызовов, но я получаю "доступ из потока, отличного от потока, в котором он был создан". Я понятия не имею, что еще можно попробовать, потому что я пытаюсь отделить интерфейс от логики.

 public GroupChatForm(string username)
        {
            gchat = new GroupChat(username);
            InitializeComponent();
        }

        private void GroupChat_Load(object sender, EventArgs e)
        {
            listMessage.Text = gchat.Start();
            Thread ctThread = new Thread(postMessage);
            ctThread.Start();
        }
        private void postMessage()
        {
            while (true)
            {
                if (this.InvokeRequired)
                    this.Invoke(new Action(postMessage));
                else //listMessage.BeginInvoke(new Action(() => listMessage.Text = listMessage.Text + gchat.getMessage()));
                    listMessage.Text = listMessage.Text + gchat.getMessage();
            }
        }
using System;
using System.Net.Sockets;

namespace StudentForYouGroupChat
{

    public class GroupChat
    {
        TcpClient clientSocket = new TcpClient();
        NetworkStream serverStream = default(NetworkStream);
        string readData = null;
        string message;
        string username;

        public GroupChat(string username)
        {
            this.username = username;
        }
        public string Start()
        {
            readData = "Conected to Chat Server ...";
            clientSocket.Connect("127.0.0.1", 8888);
            serverStream = clientSocket.GetStream();

            byte[] outStream = System.Text.Encoding.ASCII.GetBytes(username + "$");
            serverStream.Write(outStream, 0, outStream.Length);
            serverStream.Flush();
            /*Thread ctThread = new Thread(getMessage);
            ctThread.Start();*/
            return msg();
        }
        public void Send(string msg)
        {
            byte[] outStream = System.Text.Encoding.ASCII.GetBytes(msg + "$");
            serverStream.Write(outStream, 0, outStream.Length);
            serverStream.Flush();
        }
        public string getMessage()
        {
            serverStream = clientSocket.GetStream();
            var buffSize = 0;
            byte[] inStream = new byte[clientSocket.ReceiveBufferSize];
            buffSize = clientSocket.ReceiveBufferSize;
            serverStream.Read(inStream, 0, buffSize);
            var returnData = System.Text.Encoding.ASCII.GetString(inStream);
            readData = "" + returnData;
            return msg();
        }
        //Laikinai pasalinsime ir uzdesime be if'o

        public string msg() 
        {
            /*if (this.InvokeRequired)
                this.Invoke(new MethodInvoker(msg));
            return "error";*/
            //else
            return Environment.NewLine + " >> " + readData;
        }
    }
}

1 Ответ

0 голосов
/ 22 октября 2019

@ Idle_Mind Я все еще получаю сообщение об ошибке «Доступ из потока, отличного от потока, в котором он создан», как вызывать, чтобы он все еще работал?

Не уверен, что выя пробовал ... вот "упрощенная" версия того, о чем я говорю:

public class GroupChatForm : Form
{

    public void foo()
    {
        GroupChat gc = new GroupChat();
        gc.MessageReceived += Gc_MessageReceived; // wire up the event
        gc.Start();
    }

    private void Gc_MessageReceived(string message)
    {
        if (this.InvokeRequired)
        {
            this.Invoke(new MethodInvoker(delegate
            {
                Gc_MessageReceived(message); // recursive call that will become UI safe on the second call
            }));
        }
        else
        {

            // ... it's safe to update your GUI in here with "message" ...

        }
    }

}

public class GroupChat
{

    public delegate void dlgMessage(String message);
    public event dlgMessage MessageReceived;

    public void Start()
    {
        // setup your TCP stuff
        // start a new thread that has MessageLoop() below in it
    }

    public void MessageLoop() // ... running in a new THREAD ...
    {
        String message;
        bool newMessageReceived = false;
        while (true)
        {

            // ... blocking code that receives a message ...

            message = "some message from the stream";
            newMessageReceived = true;

            if (newMessageReceived)
            {
                // raise the event w/ the message
                MessageReceived?.Invoke(message);
                newMessageReceived = false;
            }
        }

    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...