在做zedgraph的实时刷新数据的时候,界面上只有一个zedgraph刷新时
if (zg.InvokeRequired)
{
zg.BeginInvoke(new Action(() => { zg.Refresh(); }));
}
程序运行正常 zedgraph刷新也正常。
当我界面上放了两个zedgraph时,再用相同的方法,对两个zedgraph进行同步的采集数据刷新操作时 会发现运行一会儿 刷新卡顿,两者无法保持同步,界面有假死的现象。
之后 把刷新方法改为:
if (zg.InvokeRequired)
{
zg.BeginInvoke(new Action(() => { zg.Invalidate(); }));
}
这样的话 运行效果会好很多。。。但是过久一点 依然会卡顿现象。
不知道如何解决为好
还是不清楚这两个到底区别在哪? 何时用invalidate or refresh。
代码如下:
private void initZedGraph(ZedGraphControl zedgraph)
{
GraphPane myPane = zedgraph.GraphPane;
if (zedgraph == zedGraphControl1)
{
myPane.Title.Text = "A";
LineItem Curve1 = myPane.AddCurve("电压1", list1, Color.Yellow, SymbolType.None);
LineItem Curve2 = myPane.AddCurve("电压2", list2, Color.Green, SymbolType.None);
LineItem Curve3 = myPane.AddCurve("电压3", list3, Color.Red, SymbolType.None);
Curve1.IsY2Axis = true;
Curve2.IsY2Axis = true;
}
if (zedgraph == zedGraphControl2)
{
myPane.Title.Text = "B";
LineItem Curve1 = myPane.AddCurve("电压1", list4, Color.Yellow, SymbolType.None);
LineItem Curve2 = myPane.AddCurve("电压2", list5, Color.Green, SymbolType.None);
LineItem Curve3 = myPane.AddCurve("电压3", list6, Color.Red, SymbolType.None);
Curve1.IsY2Axis = true;
Curve2.IsY2Axis = true;
}
myPane.XAxis.Title.Text = "时间";
myPane.YAxis.Title.Text = "距离(μm)";//"电压值"; //
myPane.XAxis.Scale.Max = 100;
myPane.XAxis.Scale.Min = 0;
myPane.XAxis.MajorTic.IsOpposite = false;
myPane.XAxis.MinorTic.IsOpposite = false;
myPane.YAxis.Scale.Max = 20;
myPane.YAxis.Scale.Min = -20;
myPane.YAxis.MajorTic.IsOpposite = false;
myPane.YAxis.MinorTic.IsOpposite = false; //小刻度
myPane.YAxis.Scale.Align = AlignP.Inside;
myPane.Y2Axis.Title.Text = "电压值";
myPane.Y2Axis.Scale.Max = 4;
myPane.Y2Axis.Scale.Min = -4;
myPane.Y2Axis.Scale.FontSpec.FontColor = Color.Black;
myPane.Y2Axis.Title.FontSpec.FontColor = Color.Black;
myPane.Y2Axis.MajorTic.IsOpposite = false;
myPane.Y2Axis.MinorTic.IsOpposite = false;
myPane.Y2Axis.Scale.Align = AlignP.Inside;
myPane.Y2Axis.IsVisible = true;
myPane.Chart.Fill = new Fill(Color.White, Color.SteelBlue, 45.0F);
myPane.Legend.IsVisible = false;
zedgraph.AxisChange();
zedgraph.Refresh();
}
private void Form1_Load(object sender, EventArgs e)
{
initZedGraph(zedGraphControl1);
initZedGraph(zedGraphControl2);
Task t = new Task(new Action(sampling));
t.Start();
}
private void sampling()
{
int itime = 0;
while (true)
{
list1.Add((double)itime, 3);
list2.Add((double)itime, 2);
list3.Add((double)itime, itime);
list4.Add((double)itime, 3);
list5.Add((double)itime, 2);
list6.Add((double)itime, 1);
itime++;
if(itime>1000000)
{
itime=0;
}
if (itime >= 100)
{
zedGraphControl1.GraphPane.XAxis.Scale.Min = (double)itime - 100;
zedGraphControl1.GraphPane.XAxis.Scale.Max = (double)itime;
RefreshGraph(zedGraphControl1);
zedGraphControl2.GraphPane.XAxis.Scale.Min = (double)itime - 100;
zedGraphControl2.GraphPane.XAxis.Scale.Max = (double)itime;
RefreshGraph(zedGraphControl2);
}
}
}
private delegate void RefreshDelegate();
private void RefreshGraph(ZedGraphControl zg)
{
if (zg == null)
return;
//判断是否是非创建控件的线程调用控件
if (zg.InvokeRequired)
{
zg.BeginInvoke(new Action(() => { zg.Invalidate(); }));
}
else
{
zg.AxisChange();
zg.Invalidate();
zg.Refresh();
}
}
------解决思路----------------------
Invalidate 是告诉系统要刷新, 而另一个则是亲自刷新, 不同之处在于前者刷新时系统会寻找合理的时机,
比如当页面在后台的时候其实不会刷新.
------解决思路----------------------
你说的那个是什么 我不知道
但是 对System.Windows.Forms.Control.Refresh()函数 的反编译 结果如下
