[英]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.