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

时间:2014-09-05 15:13:32

标签: c# multithreading drawing

我正在使用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事件也会起作用。但为了获得最佳效果,我们不能牺牲数据量和质量。正如我所说,现在它可以快速获取数据,插入和绘制,但唯一的问题是,我猜它会锁定主线程中的所有其他函数。这可能是通过线程解决的,但我是线程上的新手,有点困惑。所以我不能再进一步了。

任何想法如何前进?

1 个答案:

答案 0 :(得分:0)

我已将this.BeginInvoke更改为this this.invoke,现在它不再冻结了。您可以在此链接What's the difference between Invoke() and BeginInvoke()

上查看这两者之间的区别