Я пытаюсь получить GUI для получения сообщений из другого приложения. Однако ничего не работает - PullRequest
0 голосов
/ 20 апреля 2020

Как видно из названия, мне дали простой симулятор полета, и мне было поручено создать GUI, который подключается к симулятору полета (через программирование сокетов). Затем я могу отправлять обновления управления на симу полета через кнопку, используя TCPClient и записывать в поток (уже сделал это).

Однако, симу полета, который мне дали, отправляется информация телеметрии и мой 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 ()"), ничего не меняется, и мое представление данных не обновляется. Заранее спасибо.

1 Ответ

0 голосов
/ 21 апреля 2020

Измените 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());
                    DisplayMessage(JSONmsg);
                }
            }

        }

Вы должны .Write на MemoryStream.

...