c# 如何在此设置中实现背景?
c# How to implement a background in this setup?
我有一个很棒的 C# 程序,但是处理串行接收的字节太慢了。我在想我也许可以使用后台工作人员来解决这个问题,但我没有这方面的经验,而且我之前的所有尝试都失败了。
private void serial_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
rxBuffer += serial.ReadExisting(); // add new bytes to the string 'rxBuffer'
this.Invoke(new EventHandler(serialReceived));
}
private void serialReceived(object s, EventArgs e)
{
while (rxBuffer.Length > 0) // keep processing bytes until the string is empty
{
// textBox1.Text += rxBuffer[0];
byte b = Convert.ToByte(rxBuffer[0]);
string hexValue = b.ToString("X");
rxBuffer = rxBuffer.Remove(0, 1); // removes the 'captured' byte from the string
.....
lots of code
这个 while 循环基本上占了我整个程序的 75%。传入字节
contoll UI 元素,它们可以存储或读取文本文件,并通过串口发送回字节,它可以做任何事情。
这个系统可以工作,但是速度太慢了。所以我认为在后台工作人员中移动 while 循环可以解决它。
如何在我当前的代码设置中实现后台工作者?到目前为止我所有的尝试都失败了。
编辑:
我想补充一些我刚刚在下面评论的内容。我认为每个字节都会调用 serial_DataReceived
。在我的应用程序中,在接收到的 2 个字节之后恰好有 2 毫秒的延迟。 ReadExisting()
有时 return 多于 1 个字节。所以在串行事件中有某种延迟。我在 Qt 中也遇到过这个问题,但这从来都不是问题,我认为这是一项可以同时接收整个字符串的功能。
我个人认为 invoke()
让一切变慢,但我之前没有使用 C# 的经验所以我只是猜测,无论如何我愿意接受任何解决方案。
这段代码似乎是解决方案。我注意到我的 GUI 运行起来非常流畅
private void serial_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
rxBuffer += serial.ReadExisting();
try { backgroundWorker1.RunWorkerAsync(); } catch { }
}
private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
//private void serialReceived(object s, EventArgs e)
//{
while (rxBuffer.Length > 0)
{
// textBox1.Text += rxBuffer[0];
byte b = Convert.ToByte(rxBuffer[0]);
string hexValue = b.ToString("X");
rxBuffer = rxBuffer.Remove(0, 1);
我尝试使用 isBusy() 标志,但它不起作用,所以我改用 try 和 catch 块。
serial_Datareceived 很好地不断向字符串 rxBuffer 添加新字节,后台工作人员确保 rxString 的每个字节都得到处理。
编辑:
我有一个问题,我无法控制我的 UI 元素,面板除外。我刚刚发现。当我仍在不同的线程中时,我正在尝试访问 UI 元素。
我经常看到这个问题,人们通过串行端口发送和接收命令。我这里有一个很好的例子 ,它讨论了使用后台工作者和状态机来实现 computers/devices 之间串行的异步通信。您需要调用更新您的 UI 线程,因为您将在单独的线程上接收数据。
我有一个很棒的 C# 程序,但是处理串行接收的字节太慢了。我在想我也许可以使用后台工作人员来解决这个问题,但我没有这方面的经验,而且我之前的所有尝试都失败了。
private void serial_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
rxBuffer += serial.ReadExisting(); // add new bytes to the string 'rxBuffer'
this.Invoke(new EventHandler(serialReceived));
}
private void serialReceived(object s, EventArgs e)
{
while (rxBuffer.Length > 0) // keep processing bytes until the string is empty
{
// textBox1.Text += rxBuffer[0];
byte b = Convert.ToByte(rxBuffer[0]);
string hexValue = b.ToString("X");
rxBuffer = rxBuffer.Remove(0, 1); // removes the 'captured' byte from the string
.....
lots of code
这个 while 循环基本上占了我整个程序的 75%。传入字节
contoll UI 元素,它们可以存储或读取文本文件,并通过串口发送回字节,它可以做任何事情。
这个系统可以工作,但是速度太慢了。所以我认为在后台工作人员中移动 while 循环可以解决它。
如何在我当前的代码设置中实现后台工作者?到目前为止我所有的尝试都失败了。
编辑:
我想补充一些我刚刚在下面评论的内容。我认为每个字节都会调用 serial_DataReceived
。在我的应用程序中,在接收到的 2 个字节之后恰好有 2 毫秒的延迟。 ReadExisting()
有时 return 多于 1 个字节。所以在串行事件中有某种延迟。我在 Qt 中也遇到过这个问题,但这从来都不是问题,我认为这是一项可以同时接收整个字符串的功能。
我个人认为 invoke()
让一切变慢,但我之前没有使用 C# 的经验所以我只是猜测,无论如何我愿意接受任何解决方案。
这段代码似乎是解决方案。我注意到我的 GUI 运行起来非常流畅
private void serial_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
rxBuffer += serial.ReadExisting();
try { backgroundWorker1.RunWorkerAsync(); } catch { }
}
private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
//private void serialReceived(object s, EventArgs e)
//{
while (rxBuffer.Length > 0)
{
// textBox1.Text += rxBuffer[0];
byte b = Convert.ToByte(rxBuffer[0]);
string hexValue = b.ToString("X");
rxBuffer = rxBuffer.Remove(0, 1);
我尝试使用 isBusy() 标志,但它不起作用,所以我改用 try 和 catch 块。
serial_Datareceived 很好地不断向字符串 rxBuffer 添加新字节,后台工作人员确保 rxString 的每个字节都得到处理。
编辑: 我有一个问题,我无法控制我的 UI 元素,面板除外。我刚刚发现。当我仍在不同的线程中时,我正在尝试访问 UI 元素。
我经常看到这个问题,人们通过串行端口发送和接收命令。我这里有一个很好的例子 ,它讨论了使用后台工作者和状态机来实现 computers/devices 之间串行的异步通信。您需要调用更新您的 UI 线程,因为您将在单独的线程上接收数据。