Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#每隔几秒钟刷新一次图表_C#_Charts - Fatal编程技术网

C#每隔几秒钟刷新一次图表

C#每隔几秒钟刷新一次图表,c#,charts,C#,Charts,我有一个用C#编写的Windows窗体应用程序。这个想法是,它在点击一个按钮后绘制一个包含10个数字的图表。这个很好用。我点击按钮,得到了一张漂亮的图表。但是,我还想包括一种“自动刷新”模式,图表每隔几秒钟刷新一次。这将通过复选框启用。这是我的密码: private void chartButton_Click(object sender, EventArgs e) //draw a chart after the button is clicked { Random rdn1 = new

我有一个用C#编写的Windows窗体应用程序。这个想法是,它在点击一个按钮后绘制一个包含10个数字的图表。这个很好用。我点击按钮,得到了一张漂亮的图表。但是,我还想包括一种“自动刷新”模式,图表每隔几秒钟刷新一次。这将通过
复选框启用。这是我的密码:

private void chartButton_Click(object sender, EventArgs e) //draw a chart after the button is clicked
{
   Random rdn1 = new Random();
   int value;

   foreach (var series in ekran.Series) //clear previous values
   {
      series.Points.Clear();
   }

   for (int i = 0; i < 10; i++) //draw a chart from ten new values
   {
      value = rdn1.Next(0, 10); //for testing purpouses the value will be a random number a random number
      ekran.Series["seria1"].Points.AddXY(i, value);
   }
}

private void checkBox1_CheckedChanged(object sender, EventArgs e) 
{
   while(checkBox1.Checked) //click the chartButton every one second, when the checkbox is checked
   {
      //rysuj.PerformClick(); 
      chartButton.PerformClick();
      Thread.Sleep(1000);
   }
}   

对不起,我是个彻头彻尾的傻瓜,但我不知道这次我做错了什么。

这正是
计时器的作用。选中启动/停止或启用/禁用计时器复选框,并处理
计时器。勾选
事件以重新绘制图表。在您的情况下,事件处理程序可以简单地调用
chartButton.PerformClick()
,或者插入
PerformClick()执行的任何代码


ETA:如果图表刷新不是即时的,您可能希望将其推到另一个线程。如果它是即时的,那么实际上就不需要处理线程。

我会选择将线程与checkbox的checkChange()事件组合使用。本质上,这将允许您的应用程序在定期执行更新代码的同时保持运行。刷新由睡眠时间决定,而不是手动单击或任何其他值。。下面的示例介绍了如何执行此操作:

Thread refreshThread = null;

private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
   if (refreshThread == null) //No thread running, assume it starts this way
   {
      refreshThread = new Thread(chartRefresh);
      refreshThread.Start();
   }
   else //Thread is running, must terminate
   {
      refreshThread.Abort();
      refreshThread = null;
   }
}

private void chartRefresh()
{
   while (true)
   {
      //code to refresh chart
      Thread.Sleep(10000);
   }
}

您可能正在寻找一个
System.Windows.Forms.Timer
。while循环正在冻结您的UI线程。使用计时器或后台工作人员。以前有人问过很多次,看看SO或Google,你会发现很多资源。从代码中调用事件是一种非常糟糕的编码实践。按照@adv12的建议使用计时器。非常感谢!但我仍然有问题。我编辑了我的问题并添加了两个细节:首先,删除
timer.Enabled=false计时器勾号
处理程序的code>行。正如我在下面提到的,这会导致计时器停止,不再滴答作响。其次,在您的
checkBox1\u checkChanged
处理程序中,去掉
while
语句-这会导致更直接的问题。相反,将整个方法更改为一行:
timer.Enabled=checkBox1.Checked线程化带来了很多问题,例如,必须通过
Invoke
BeginInvoke
调度对
chartresh
方法中GUI控件的所有访问,以避免非法的跨线程调用
System.Windows.Forms.Timer
封装了您试图提供的功能,对于除了最聪明和最有经验的程序员以外的所有程序员来说都更安全。即使图表刷新不是即时的,线程也没有什么好处。UI控件不是线程安全的,因此不允许从后台线程修改它们。为了“正确”,后台线程必须通过
Control.Invoke
处理所有UI更改,这意味着所有更改最终都会发生在UI线程上。
Thread refreshThread = null;

private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
   if (refreshThread == null) //No thread running, assume it starts this way
   {
      refreshThread = new Thread(chartRefresh);
      refreshThread.Start();
   }
   else //Thread is running, must terminate
   {
      refreshThread.Abort();
      refreshThread = null;
   }
}

private void chartRefresh()
{
   while (true)
   {
      //code to refresh chart
      Thread.Sleep(10000);
   }
}