我正在使用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事件也会起作用。但为了获得最佳效果,我们不能牺牲数据量和质量。正如我所说,现在它可以快速获取数据,插入和绘制,但唯一的问题是,我猜它会锁定主线程中的所有其他函数。这可能是通过线程解决的,但我是线程上的新手,有点困惑。所以我不能再进一步了。
任何想法如何前进?
答案 0 :(得分:0)
我已将this.BeginInvoke更改为this this.invoke,现在它不再冻结了。您可以在此链接What's the difference between Invoke() and BeginInvoke()
上查看这两者之间的区别