我试图让我的 GUI 接收来自另一个应用程序的消息。但是,没有任何效果

Posted

技术标签:

【中文标题】我试图让我的 GUI 接收来自另一个应用程序的消息。但是,没有任何效果【英文标题】:I am trying to get my GUI to receive messages from another application. However, nothing works 【发布时间】:2020-08-03 11:58:45 【问题描述】:

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

但是,我收到的飞行模拟会发送遥测信息,我的 GUI 应该接收该信息并将其显示在 datagridView 上。我尝试在后台运行一个线程来调用 ReceiveMessage 方法,然后 DisplayMessage 方法应该被激活,但没有任何效果。 Flight Simulator 发送一个 JSON 字符串,据我了解,我的 GUI 需要对其进行反序列化并将其呈现给 Data Grid View。

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

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 的 Listen 按钮(启动“start()”方法),没有任何变化,我的 datagridview 也没有更新。提前谢谢你。

【问题讨论】:

您是否在代码中的某处调用了messageInThread.Start(); 我做了(忘记在帖子中添加它),但它仍然不起作用,我的数据网格没有更新。 您从网络流中读取到byte[] buffer,然后从空内存流中读取到相同的buffer 中?你是说 ms.Write() 吗? @OguzOzgul 是的,谢谢。我在这里犯了一个错误。我将其更改为写入缓冲区。但是,它仍然不会在我的 datagridview 上显示消息。可能是因为对象参数的排序方式(因为对象参数是7)?例如,如果模拟飞行向我发送一个以 Throttle 作为参数开头的对象,但我的 GUI 的 TelemetryUpdate 以 Altitude 开头。 您确定文本流是ASCII 而不是UTF8 或其他格式? 【参考方案1】:

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

【讨论】:

非常感谢!我刚改了。 datagridview 仍然没有显示从飞行模拟器发送的任何内容,但至少我终于明白为什么我应该写入内存流。

以上是关于我试图让我的 GUI 接收来自另一个应用程序的消息。但是,没有任何效果的主要内容,如果未能解决你的问题,请参考以下文章

从另一个程序接收 JSON 编码信息到我的 GUI

从另一个 GUI 文件 PyQT5 打开 GUI 文件

如何让我的 MDB 忽略来自自身的消息?

为啥我无法在 Android 设备上接收来自 GCM 的消息

如何并行运行 Qt GUI 和 Linux 消息队列接收线程?

运行另一个进程而不冻结 GUI