我正在使用DataReceived
事件讀取串行端口的數據。在接收數據時,我正在對數據進行插值並實時顯示在PictureBox中。一切工作正常,我可以很快並且很快地在PictureBox中看到內插的熱圖數據。但問題是數據正在被讀取,WinForms應用程序凍結,表單甚至無法應用FormPaint
事件。 DataReceived
事件獲取數據,對其進行插值並將其應用於PictureBox。突然,DataReceived
事件開始並獲取數據並在同一週期內繼續運行。serialport dataReceived事件和線程問題導致凍結C#中的窗體#
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事件也起作用。但爲了獲得最佳結果,我們不能犧牲數據量和質量。正如我所說的,現在它獲取數據,插入並快速繪製,但唯一的問題是,它鎖定了主線程中的所有其他函數,我猜。這可能通過線程來解決,但我是線程中的新人,並且有點困惑。所以我不能走得更遠。
任何想法如何前進?
這是一個標準問題,一個* fire-hose *問題。 UI線程根本跟不上。在調用之前,您需要收集更多數據。 – 2014-09-05 15:58:39