2012-10-12 31 views
3

我正在使用.NET的Microsoft Chart庫。我試圖繪製每10ms從硬件生成的數據。除了當我移動主窗體時,這通常工作正常。然後更新圖表會阻止工作線程。作爲模擬數據的例子,請看附件中的代碼。MSChart更新塊工作人員thead

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Diagnostics; 
using System.Threading; 

namespace ChartTest 
{ 
    public partial class Form1 : Form 
    { 
     private Worker _worker; 
     double oldData; 

     public Form1() 
     { 
      InitializeComponent(); 
      oldData = 0.0; 
      _worker = new Worker(); 
      _worker.NewDataEvent += new EventHandler(_worker_NewDataEvent); 
     } 

     void _worker_NewDataEvent(object sender, EventArgs e) 
     { 
      double data = _worker.GetData(); 
      Add(data - oldData); 
      oldData = data; 
     } 

     private delegate void AddDelegate(double data); 

     public void Add(double data) 
     { 
      if (chart1.InvokeRequired) 
      { 
       chart1.Invoke(new AddDelegate(Add), data); 
      } 
      else 
      { 
       chart1.Series[0].Points.AddY(data); 
      } 
     } 

     private void btnGo_Click(object sender, EventArgs e) 
     { 
      _worker.Start(); 
     } 
    } 

    public class Worker 
    { 
     private double data; 
     Stopwatch st; 
     bool running; 

     public Worker() 
     { 
      data = 0.0; 
      st = new Stopwatch(); 
      running = false; 
     } 

     public event EventHandler NewDataEvent; 

     public void Start() 
     { 
      running = true; 
      Thread t = new Thread(Run); 
      t.Start(); 
     } 

     private void Run() 
     { 
      st.Start(); 
      while (running) 
      { 
       Thread.Sleep(10); 
       data = (double)st.ElapsedTicks/(double)Stopwatch.Frequency; 
       NewDataEvent(this, null); 
      } 
     } 

     public double GetData() 
     { 
      return data; 
     } 
    } 
} 

注意:如有必要,我可以提供設計器代碼。

Worker類運行一個線程,每10毫秒生成一些數據。它引發了一個Form1用來在圖表中調用更新的事件。這通常很好,除非拖延UI的渲染,例如拖動窗體。如果工作人員的Run()函數對時間要求很高,這是有問題的。有沒有辦法在不阻塞線程的情況下儘快更新圖表?

如果這意味着有時需要更新圖20毫秒,那很好。我只希望它儘快更新。謝謝。

回答

0

(我想這是WPF和圖表只是增加點,這不是與像填充區域更看中的部分圖表):

每10 ms意味着你要添加100個圖形對象每一秒,如果你的應用程序保持打開1分鐘,您的圖表至少有6000個圖形對象,當您移動主窗口時,UI需要重繪至少6000個圖形對象!這是我期待的!現在添加區域和顏色,厚度和其他東西... UI線程實際上已經耗盡。

我認爲你首先採用某種數學過程(分析或統計學過程如插值)來產生有意義的抽樣,然後繪製它們更合適。

我不太瞭解Win Forms,但我認爲這對他們來說也是正確的。