下面代码 2个线程 一个加点 一个刷新 调用同一控件 报错 "集合已修改;可能无法执行枚举操作。"
请问应该怎么修改? 放在同一线程 会造成加点太少
另外问下 windows最快刷新频率大约多少毫秒?
public Form1()
{
InitializeComponent(); chart1.Series["Series1"].Color = Color.Lime;
chart1.Series["Series1"].Points.AddXY(0, 0); Thread t1 = new Thread(DrawQuxian);
t1.Start(); Thread t2 = new Thread(FlashQuxian);
t2.Start();
} int i = 0;
private void DrawQuxian()
{
while (true)
{
//拿点要求10毫秒以内
this.chart1.Series["Series1"].Points.AddXY(i, i%10);
i++;
Thread.Sleep(10);
}
} private void FlashQuxian()
{
while (true)
{
try
{
if (this.chart1.InvokeRequired)
{
this.Invoke((EventHandler)(delegate
{
//刷新要求1000毫秒以内
this.chart1.Invalidate();
}));
}
}
catch
{ } Thread.Sleep(1000);
}
}
请问应该怎么修改? 放在同一线程 会造成加点太少
另外问下 windows最快刷新频率大约多少毫秒?
public Form1()
{
InitializeComponent(); chart1.Series["Series1"].Color = Color.Lime;
chart1.Series["Series1"].Points.AddXY(0, 0); Thread t1 = new Thread(DrawQuxian);
t1.Start(); Thread t2 = new Thread(FlashQuxian);
t2.Start();
} int i = 0;
private void DrawQuxian()
{
while (true)
{
//拿点要求10毫秒以内
this.chart1.Series["Series1"].Points.AddXY(i, i%10);
i++;
Thread.Sleep(10);
}
} private void FlashQuxian()
{
while (true)
{
try
{
if (this.chart1.InvokeRequired)
{
this.Invoke((EventHandler)(delegate
{
//刷新要求1000毫秒以内
this.chart1.Invalidate();
}));
}
}
catch
{ } Thread.Sleep(1000);
}
}
private void button1_Click(object sender, EventArgs e)
{
flag = false;
Thread thread = new Thread(new ThreadStart(target));
thread.IsBackground = true;
thread.Start();
progressBar1.Maximum = 100;
Thread threada = new Thread(new ThreadStart(target));
threada.IsBackground = true;
threada.Start();
progressBar1.Maximum = 100;
} public void target()
{
MethodInvoker mi = new MethodInvoker(countPro);
while (!flag)
{
this.Invoke(mi);
Thread.Sleep(100);
} }
{
int min;
double numerator, denominator, completed;
min = this.progressBar1.Minimum;
if (this.progressBar1.Value == this.progressBar1.Maximum)
{
this.progressBar1.Value = this.progressBar1.Minimum;
}
else
{
this.progressBar1.PerformStep();
}
//显示进度
this.textBox1.Text = this.progressBar1.Value.ToString();
numerator = this.progressBar1.Value - min;
denominator = this.progressBar1.Maximum - this.progressBar1.Minimum;
completed = (numerator / denominator) * 100.0;
this.label2.Text = Math.Round(completed) + "%";
}
放到Invoke里去做
操作Series的代码全部回主线程操作即可。