serialport dataReceived事件和线程问题导致C#中的表单冻结

本文关键字:表单 冻结 事件 dataReceived 线程 问题 serialport | 更新日期: 2023-09-27 18:20:58

我正在使用DataReceived事件从串行端口读取数据。在接收数据时,我对数据进行插值,并将其实时显示在PictureBox中。一切都很好,我可以很快地在PictureBox中看到插值的热图数据。但问题是,在读取数据时,WinForms应用程序冻结,表单甚至无法应用FormPaint事件。DataReceived事件获取数据,对其进行插值,并将其应用于PictureBox。突然,DataReceived事件开始并获取数据,并在同一周期中继续进行。

DataReceived事件->PictureBox刷新->对PictureBox进行插值和绘制。

以下是一些可能帮助您理解问题的代码:

void seriPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{  
   ......  
   //I am getting data here
   .....  
   //then in order to see the data in picturebox in real time I use the following
   this.BeginInvoke((MethodInvoker)delegate { pictureBox1.Refresh();   });
}

以下是触发刷新时的PictureBox Paint事件:

private void FrameBox_Paint(object sender, PaintEventArgs e)
{
    if (activeFrame != null)
    {
        DrawChart chart = new DrawChart();
        chart.ContourFrame(e.Graphics, activeFrame);
    }
}

以下是contourFrame方法:

//interpolation code above
for (int i = 0; i < npoints; i++)
{
    for (int j = 0; j < npoints; j++)
    {
       color = AddColor(pts[i, j], zmin, zmax);
       aBrush = new SolidBrush(color);
       points[0] = new PointF(pts[i, j].X, pts[i, j].Y);
       points[1] = new PointF(pts[i + 1, j].X, pts[i + 1, j].Y);
       points[2] = new PointF(pts[i + 1, j + 1].X, pts[i + 1, j + 1].Y);
       points[3] = new PointF(pts[i, j + 1].X, pts[i, j + 1].Y);
       g.FillPolygon(aBrush, points);
       aBrush.Dispose();
    }
}

我认为g.FillPolygon方法比预期花费更多的时间。因为当我在其中进行评论时,form_paint事件也起作用。但为了获得最佳结果,我们不能牺牲数据的数量和质量。正如我所说,现在它可以快速获取数据、插值和绘制,但唯一的问题是,我想它会锁定主线程中的所有其他函数。这可能可以通过线程来解决,但我对线程很陌生,有点困惑。所以我不能更进一步了。

有什么想法可以继续前进吗?

serialport dataReceived事件和线程问题导致C#中的表单冻结

我已经更改了这个。开始调用this.invoke,现在它不再冻结。你可以在这个链接上看看这两者之间的区别What';调用()和开始调用()之间的区别