我正在尝试让我的GUI接收来自其他应用程序的消息。但是,没有任何效果

问题描述 投票:0回答:1

正如标题所述,我得到了一个简单的飞行模拟器,并受命创建一个连接到飞行模拟器的GUI(通过套接字编程)。然后,我可以使用TCPClient通过按钮将控制更新发送到飞行模拟并写入流(已经完成)。

但是,我得到的航班Sim会发送遥测信息,而我的GUI应该会接收该信息并将其显示在datagridView上。我尝试在后台运行线程以调用ReceiveMessage方法,然后应该激活DisplayMessage方法,但没有任何效果。 Flight Simulator发送一个JSON字符串,据我了解,我的GUI需要反序列化并将其显示在“数据网格视图”中。

对不起,如果我的解释不太好。这是代码:程序连接时的侦听过程应按以下顺序进行:

public void ConnectProgram(string IPaddress, int port)
        {            
            tcpClient = new TcpClient();
            tcpClient.Connect(IPaddress, port);
        }
private void start()
        {
            messageInThread = new Thread(new ThreadStart(ReceiveMessage))
            {
                IsBackground = true
            };
            //thank you LarsTech for pointing out to write .Start() but it still doesn't work
            messageInThread.Start();
            btnListen.Enabled = false;
        }
private void ReceiveMessage()
        {
            //netStream = tcpClient.GetStream();
            string JSONmsg = " ";
            int i;


            using (netStream = tcpClient.GetStream())
            {
                byte[] buffer = new byte[1024];
                using (MemoryStream ms = new MemoryStream())
                {
                    int numBytesRead;
                    while ((numBytesRead = netStream.Read(buffer, 0, buffer.Length)) > 0)
                    {
                        ms.Read(buffer, 0, numBytesRead);
                    }
                    JSONmsg = Encoding.ASCII.GetString(ms.ToArray(), 0, (int)ms.Length);
                    DisplayMessage(JSONmsg);
                }
            }

        }
private void DisplayMessage(string JSONmsg)
        {
            if (dataTelemetryInfo.InvokeRequired)
            {
                object[] args = new object[] { JSONmsg };
                this.Invoke(new StringArg(DisplayMessage), args);  //StringArg is a delegate with a string as a parameter       
            }
            else
            {
                lblTest.Text += JSONmsg;

                telemetryInfo = serializer.Deserialize<TelemetryUpdate>(JSONmsg);

                dataTelemetryInfo.Rows.Add(telemetryInfo.Altitude.ToString(), telemetryInfo.ElevatorPitch.ToString(), telemetryInfo.Pitch.ToString(),
               telemetryInfo.Speed.ToString(), telemetryInfo.Throttle.ToString(), telemetryInfo.VerticalSpeed.ToString(),
               telemetryInfo.WarningCode.ToString());  

            }
        }

一旦连接程序,然后单击我的GUI的“侦听”按钮(启动“ start()”方法),就什么都没有改变,并且datagridview不会更新。预先谢谢你。

c# multithreading user-interface networkstream
1个回答
0
投票

ReceiveMessage更改为:

private void ReceiveMessage()
        {
            //netStream = tcpClient.GetStream();
            string JSONmsg = " ";
            int i;


            using (netStream = tcpClient.GetStream())
            {
                byte[] buffer = new byte[1024];
                using (MemoryStream ms = new MemoryStream())
                {
                    int numBytesRead;
                    while ((numBytesRead = netStream.Read(buffer, 0, buffer.Length)) > 0)
                    {
                        ms.Write(buffer, 0, numBytesRead);
                    }
                    JSONmsg = Encoding.ASCII.GetString(ms.ToArray(), 0, (int)ms.Length);
                    DisplayMessage(JSONmsg);
                }
            }

        }

您必须将.Write设置为MemoryStream

© www.soinside.com 2019 - 2024. All rights reserved.