我正在尝试为我的 mschart 图表制作一个缩小功能。我的想法是为图表设置一个单击方法,每次用鼠标右键单击图表时,缩放值都应该改变。因此图表应该响应并有更多值的空间。我做了 4 个缩放步骤:240 个值、3600 个值、43'200 个值、86'400 个。图表点击有条不紊如下所示:
void chart_holder_Click(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
if (counter < 3)
{
counter++;
}
else
{
counter = 0;
}
switch (counter)
{
default:
//zoomsize -> 240s | 4min
zoomSize = 0;
graphSizing = 240;
TempBuffer = new DataPoint[graphSizing];
file = new DataPoint[graphSizing];
TempbufferValuesTOZero();
FileValuesTOZero();
break;
case 0:
//zoomsize -> 240s | 4min
zoomSize = 0;
graphSizing = 240;
TempBuffer = new DataPoint[graphSizing];
file = new DataPoint[graphSizing];
TempbufferValuesTOZero();
FileValuesTOZero();
break;
case 1:
//zoomsize -> 3'600s | 1h
zoomSize = 1;
graphSizing = 3600;
TempBuffer = new DataPoint[graphSizing];
file = new DataPoint[graphSizing];
TempbufferValuesTOZero();
FileValuesTOZero();
break;
case 2:
//zoomsize -> 43'200s | 12h
zoomSize = 2;
graphSizing = 43200;
TempBuffer = new DataPoint[graphSizing];
file = new DataPoint[graphSizing];
TempbufferValuesTOZero();
FileValuesTOZero();
break;
case 3:
//zoomsize -> 86'400s | 24h
zoomSize = 3;
graphSizing = 86400;
TempBuffer = new DataPoint[graphSizing];
file = new DataPoint[graphSizing];
TempbufferValuesTOZero();
FileValuesTOZero();
break;
}
}
}
AxisX.Maximum 使用属性定义public static int graphSizing { get; set; }
。我得到的图表是实时图表,因此每秒都会添加新值等。TempbufferValuesTOZero、FileValuesTOZero 用 0/0 填充整个数组。
在我将值添加到图表之前,我用这种方法准备它们:我有一个 switch 语句,它检查 zoomSize 以了解如何准备数据
public void prepareData()
{
switch (zoomSize)
{
default:
prepData1();
break;
case 0:
prepData1();
break;
case 1:
prepData2();
break;
case 2:
prepData3();
break;
case 3:
prepData4();
break;
}
}
例如它是如何准备的
public void prepData1()
{
graphSizing = 240;
Int32 unixTimestamp = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
for (double i = unixTimestamp; unixTimestamp - graphSizing < i; i--)
{
bool exists = true;
DateTime x = UnixTODateTime(i);
if (exists != (Array.Exists(file, element => element.XValue == i)))
{
TempBuffer = TempBuffer.Skip(1).Concat(new DataPoint[] { new DataPoint(x.ToOADate(), 0) }).ToArray();
}
else
{
DataPoint point = Array.Find(file, element => element.XValue == i);
TempBuffer = TempBuffer.Skip(1).Concat(new DataPoint[] { new DataPoint(x.ToOADate(), point.YValues) }).ToArray();
}
}
}
之后调用此方法以显示图表中的值:
public void fileRead()
{
chart_holder.Series[0].Points.Clear();
foreach (DataPoint a in TempBuffer)
{
chart_holder.Series[0].Points.Add(a);
if (a.YValues[0] == 9999)
{
a.Color = Color.Red;
}
}
}
TempBuffer 是一个数据点数组,我在其中存储值 ( public DataPoint[] TempBuffer = new DataPoint[graphSizing];
)。
但它并不像预期的那样安静地工作。只有默认的 / 0 案例按计划完美运行。但是一旦我想缩小,它就不再起作用了。在案例 2 中,AxisX 值完全错误,并且 AxisY 值甚至没有出现。在案例 3 和 4 中,程序崩溃了。CPU使用率也很高。
知道为什么其他情况不像 default / 1 那样有效吗?以及如何提高性能并最大限度地减少高 CPU 使用率?
感谢您的帮助
问候 C.User