繁体   English   中英

写入未选择的选项卡中的文本框

[英]Writing to textbox inside an unselected tab

我有一个可以在串行,GPIB,USB和以太网上读写的程序。 它具有每种通讯方式的选项卡,其中的一个文本框内部显示端口上的通讯。 选项卡之一被列为“所有通信”,并且该文本框包含来自所有通信方法的数据。 我目前正在处理代码的串行端口部分,并且我的程序一直冻结。 在我运行代码的一半时间里,它的功能没有问题,同时写入了两个选项卡。 当它尝试写入未选中的选项卡中的文本框时,它的另一半冻结(通过一次一行地查找代码来找到)。

我将文本框拉到选项卡控件之外,这解决了冻结问题。 程序冻结时,它不会显示错误消息,也不会崩溃,因此没有崩溃报告(周末运行该报告,并且从未完成崩溃)。

我认为我需要选择另一个选项卡,然后对其进行写入,但是为什么代码在我运行它的一半时间内可以正常工作?

程序图片

        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {
        rxString = rxString + serialPort1.ReadExisting();

        if (rxString == "\b")
        {
            //Removes 1 character when backspace is the key pressed
            rxSerialTextBox.ReadOnly = false;
            rxSerialTextBox.Select(rxSerialTextBox.TextLength - 1, rxSerialTextBox.TextLength);
            rxSerialTextBox.SelectedText = String.Empty;
            rxSerialTextBox.ReadOnly = true;
            rxString = "";                
        }

        while (rxString.Length != 0)
        {
            try
            {
                while (rxString.Length != 0)
                {
                    if (rxString.IndexOf("\r\n") == 0)
                    {
                        //Adds a newline when newline is the next characters in the string
                        rxString = rxString.Substring(rxString.IndexOf("\r\n") + 2);
                        rxAllCommsTextBox.AppendText(Environment.NewLine);
                        rxSerialTextBox.AppendText(Environment.NewLine);
                    }
                    //Adds a new character to the text box
                    rxAllCommsTextBox.AppendText(rxString.Substring(0, 1));
                    rxSerialTextBox.AppendText(rxString.Substring(0, 1));
                    rxString = rxString.Substring(1, rxString.Length - 1);
                }
            }
            catch
            {
                //rxString = "";
            }
        }
    }

快速查看一下SerialPort.DataReceived事件文档会引起以下“ 备注”部分的段落:

从SerialPort对象接收数据时,在辅助线程上引发DataReceived事件。 由于此事件是在辅助线程而非主线程上引发的,因此尝试修改主线程中的某些元素(例如UI元素)可能会引发线程异常。 如果需要修改主窗体或控件中的元素,请使用Invoke将更改请求回发,这将在适当的线程上完成工作。

因此,您触摸该事件处理程序内的UI元素(文本框)的代码不正确。 文档没有说的是,当您这样做时,行为是不确定的-有时可能会起作用,又一次挂起,又一次抛出异常。

因此,与其问为什么有时错误的代码有时起作用,不如将注意力集中在使它正确上,只有在某些事情不起作用的情况下,再问原因并寻求解决方案。

PS:我将不讨论如何解决具体问题-有关如何封送对UI线程的调用的大量文章,解释和示例,在这方面,您的情况没有什么特别的。

您的问题有点令人困惑...

您可以尝试,这是正确理解的,请尝试保留要分配内存上下文的值,并根据另一种迭代类型分配值。

目前应用程序冻结,这显示了断点? 预期的行为有效吗?

我会尝试一个配置对象,例如具有各种配置和特定状态的列表,以及将列表传递给tabcontrol所需的状态。 显然,它需要检查什么不起作用以及为什么不起作用...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM