2014-09-05 58 views
1

我正在使用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事件也起作用。但爲了獲得最佳結果,我們不能犧牲數據量和質量。正如我所說的,現在它獲取數據,插入並快速繪製,但唯一的問題是,它鎖定了主線程中的所有其他函數,我猜。這可能通過線程來解決,但我是線程中的新人,並且有點困惑。所以我不能走得更遠。

任何想法如何前進?

+1

這是一個標準問題,一個* fire-hose *問題。 UI線程根本跟不上。在調用之前,您需要收集更多數據。 – 2014-09-05 15:58:39

回答