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事件也起作用。但为了获得最佳结果,我们不能牺牲数据的数量和质量。正如我所说,现在它可以快速获取数据、插值和绘制,但唯一的问题是,我想它会锁定主线程中的所有其他函数。这可能可以通过线程来解决,但我对线程很陌生,有点困惑。所以我不能更进一步了。
有什么想法可以继续前进吗?
我已经更改了这个。开始调用this.invoke,现在它不再冻结。你可以在这个链接上看看这两者之间的区别What';调用()和开始调用()之间的区别