2016-06-29 25 views
0

ここでは、通常、1秒ごとにランダムなポイントを追加するグラフ(グラフ1)があります。しかし、そうではありません...私は問題が何であるかを調べようとしましたが、ここではもうアイデアはありません... タイマーが開始され、毎秒ラベル1が変わりますが、グラフは変わりません...ボタン1をクリックすると新しいポイントが追加されます。 私は何を欠席しましたか?助けてください...ありがとうございます。ここで[OK]をc#リアルタイムのグラフの更新

namespace Test_Chart1 
{ 
public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 

     graph1.ChartAreas[0].AxisX.ScrollBar.Enabled = true; 
     graph1.ChartAreas[0].AxisX.IsLabelAutoFit = true; 
     graph1.ChartAreas[0].AxisX.ScaleView.Size = 40; 
     System.Timers.Timer _Timer1s = new System.Timers.Timer(1000); //object 
     _Timer1s.Elapsed += _Timer1sElapsed;       //event in object 
     _Timer1s.Start();            //start counting    
    } 
    private void _Timer1sElapsed(object sender, EventArgs e)//Timer each 100ms 
    {   
     if (label1.BackColor == Color.Red) 
     { 
      label1.BackColor = Color.Blue; 
      PutValueInGraph1();    
     } 
     else label1.BackColor = Color.Red;    
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     PutValueInGraph1(); 
    } 
    private void PutValueInGraph1() 
    { 
     graph1.ChartAreas[0].AxisX.ScrollBar.Enabled = true; 
     graph1.ChartAreas[0].AxisX.IsLabelAutoFit = true; 
     graph1.ChartAreas[0].AxisX.ScaleView.Size = 100; 
     Random Rand_Value = new Random(); 
     int ValueToAdd = Rand_Value.Next(1, 100); 
     listBox1.Items.Add(ValueToAdd.ToString()); 
     graph1.Series["Data1"].Points.AddY(ValueToAdd); 
     if (graph1.ChartAreas[0].AxisX.Maximum-10 > graph1.ChartAreas[0].AxisX.ScaleView.Size) 
     { 
       graph1.ChartAreas[0].AxisX.ScaleView.Scroll(graph1.ChartAreas[0].AxisX.Maximum); 
      graph1.Series["Data1"].Points.RemoveAt(0); 
     } 
    } 
} 
} 

は新しいものです:

public partial class Form1 : Form 
{ 
static System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer(); 

    public Form1() 
    { 
     InitializeComponent(); 
     myTimer.Tick += new EventHandler(TimerEventProcessor); 
     myTimer.Interval = 1;   
    } 

    private void TimerEventProcessor(Object myObject, EventArgs myEventArgs) 
    { 
     Random Rand_Value = new Random(); 
     int ValueToAdd = Rand_Value.Next(1, 100); 
     listBox1.Items.Add(ValueToAdd.ToString()); 
     graph1.Series["Data1"].Points.AddY(ValueToAdd); 
     if (graph1.ChartAreas[0].AxisX.Maximum - 10 > graph1.ChartAreas[0].AxisX.ScaleView.Size) 
     { 
      graph1.ChartAreas[0].AxisX.ScaleView.Scroll(graph1.ChartAreas[0].AxisX.Maximum); 
      graph1.Series["Data1"].Points.RemoveAt(0); 
     } 
    } 
    private void btn_Start_Click_1(object sender, EventArgs e) 
    { 
     graph1.ChartAreas[0].AxisX.ScrollBar.Enabled = true; 
     graph1.ChartAreas[0].AxisX.IsLabelAutoFit = true; 
     graph1.ChartAreas[0].AxisX.ScaleView.Size = 100; 
     myTimer.Start(); 
     BlinkLed.BackColor = Color.YellowGreen; 
    } 
    private void btn_Stop_Click(object sender, EventArgs e) 
    { 
     myTimer.Stop(); 
     BlinkLed.BackColor = Color.AliceBlue; 
    } 
} 

あなたはそれが良いと思いますか? スレッドの変更はどうですか?

私はボタンを持っていた場合:

private void PutValueInGraph1() 
    { 
     Random Rand_Value = new Random(); 
     int ValueToAdd = Rand_Value.Next(1, 100); 
     listBox1.Items.Add(ValueToAdd.ToString()); 
     graph1.Series["Data1"].Points.AddY(ValueToAdd); 
     if (graph1.ChartAreas[0].AxisX.Maximum-10 > graph1.ChartAreas[0].AxisX.ScaleView.Size) 
     { 
      graph1.ChartAreas[0].AxisX.ScaleView.Scroll(graph1.ChartAreas[0].AxisX.Maximum); 
      graph1.Series["Data1"].Points.RemoveAt(0); 
     } 
    } 

    private void button1_Click(object sender, EventArgs e) 
    {//try to raise exception 
     PutValueInGraph1(); 
    } 

をし、私はこのようなイベントを変更:

private void TimerEventProcessor(Object myObject, EventArgs myEventArgs) 
    {//try to raise exception 
     PutValueInGraph1(); 
    } 

私はタイマーを開始していると私は上のすべての時間をクリックすると、データ入力が加速ボタン1。

なぜtom_imkが例外として例外がありますか? 同じ機能に同時にアクセスできるので....?

ご回答ありがとうございます。

+0

スタートタイマー、今あなたがSystem.Windows.Forms.Timerを使用し、それは重要な違いですが、あなたがでSystem.Timers.Timerを使用した最初のバージョンでは –

+0

をクリックします。 –

答えて

0

例外が発生していないのに驚いています。あなたはUIスレッドの外でUI要素を操作しています。

この問題の答えを参照してください。 How to update the GUI from another thread in C#?

EDIT:これは単に、ここで使用され、間違ったクラスです:timerelapsedメソッドはUIスレッド上で実行されない理由 を明確にします。そのため、簡単な解決策は、フォームコンストラクタにSystem.Timers.Timerを作成せずに、フォームデザイナーのフォームにタイマーをドロップして代わりに使用することです。 sowjanya attaluriによる解決策は正解とマークする必要があります。

+0

私はポイントが表示されません。あなたはlabel1について話していますか?そうであれば、Label1はイベントtimerelapsedでのみ変更されます...他のどのスレッドがそれにアクセスしていますか? – Jablonovo

+0

OPのコードの最初のバージョンはSystem.Timers.Timerを使用しますが、フォームデザイナーに組み込まれたSystem.Windows.Forms.Timerを使用していたはずです。つまり、timerelapsedはUIスレッドの外側で実行されます。私は正確なコード(最初のバージョンが投稿された)を再現し、一貫した例外を得ました。私は具体的に時間を指すように私の答えを編集します。 –

+0

説明ありがとう! – Jablonovo

0

以下のサンプルコードを試してみましたが、うまく動作しています。ボタンから

public Form7() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     chart1.ChartAreas[0].AxisX.Maximum = 100; 
     chart1.ChartAreas[0].AxisX.Minimum = 0; 
     chart1.ChartAreas[0].AxisX.Interval = 1; 

     timer1.Start();   
    } 

    private void timer1_Tick(object sender, EventArgs e) 
    { 
     Random Rand_Value = new Random(); 
     int ValueToAdd = Rand_Value.Next(1, 100); 
     chart1.Series[0].Points.AddY(ValueToAdd); 
    } 
+0

ありがとう!しかし、私はなぜそれが以前に働いていないだろうか分からない.... – Jablonovo

+0

私はあなたがボタンをクリックしてタイマーを開始する必要があると思う。その作業がうまくいったら、答えとしてマークしてください –

関連する問題