C# WinForms 试图保持时间线同步
C# WinForms Trying to keep timeline synchronized
你好,我试图每秒更新我的图表,所有图表应该总是在同一时间。为了更好地理解,我将包含一张图片,但首先我将解释实际发生的情况。
所以我发送了 ping 请求,每次有结果时,它都会将其记录在一个名为文件的数据点数组中。一切正常,按预期工作。
同时,两个定时器是运行,一个定时器调用了一个准备数据的方法(比方说在特定时间在数组中找不到数据->它应该设置值为0 ).准备好的数据比在缓冲区中。
第二个计时器正在更新 UI 并从 tempData 中读取,但这并没有按预期或希望的那样工作。
定时器:
myTimer.Interval = 1000;
myTimer.Tick += FileReadFunction;
aTimer.Elapsed += new System.Timers.ElapsedEventHandler(prepData);
aTimer.Interval = 1000;
启动计时器的按钮点击:
private void _tbStartAll_Click(object sender, EventArgs e)
{
lock (_hosts)
{
foreach (HostPinger hp in _hosts)
hp.Start();
myTimer.Start();
aTimer.Enabled = true;
}
}
表格数据的准备方法Class:
public void prepData(object objectInfo, EventArgs e)
{
foreach (NetPinger.source.AddGraph b in graphList)
{
b.prepareData();
}
}
准备数据方法:
public void prepareData()
{
double unixTimestamp = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
for (double i = unixTimestamp; unixTimestamp - graphSizing < i; i--)
{
bool exists;
try
{
exists = Array.Exists(file, element => element.XValue == i);
exists = true;
}
catch
{
exists = false;
}
try
{
if (exists == false)
{
TempBuffer = TempBuffer.Skip(1).Concat(new DataPoint[] { new DataPoint(i, 0) }).ToArray();
}
else
{
DataPoint point = Array.Find(file, element => element.XValue == i);
TempBuffer = TempBuffer.Skip(1).Concat(new DataPoint[] { (point) }).ToArray();
}
}
catch (Exception ex)
{
//just for debugging...
}
}
}
表格中的文件读取方法Class:
private void FileReadFunction(object objectInfo, EventArgs e)
{
foreach (NetPinger.source.AddGraph b in graphList)
{
b.fileRead();
}
}
方法文件读取/更新图表:
public void fileRead()
{
//double unixTimestamp = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
chart_holder.Series[0].Points.Clear();
foreach (DataPoint a in TempBuffer)
{
chart_holder.Series[0].Points.Add(a);
}
}
时间同步的图片示例:
我有点想不通为什么它不起作用,是因为一个线程比另一个线程快吗?或者是什么原因,我该如何解决?非常感谢你的帮助。
你好C.User
我通过稍微更改代码解决了这个问题。为了保持同步,我首先准备数据,然后再显示它。数据准备好后,所有数据都会显示出来。另外,我现在只使用一个计时器,而不是两个。
你好,我试图每秒更新我的图表,所有图表应该总是在同一时间。为了更好地理解,我将包含一张图片,但首先我将解释实际发生的情况。
所以我发送了 ping 请求,每次有结果时,它都会将其记录在一个名为文件的数据点数组中。一切正常,按预期工作。
同时,两个定时器是运行,一个定时器调用了一个准备数据的方法(比方说在特定时间在数组中找不到数据->它应该设置值为0 ).准备好的数据比在缓冲区中。
第二个计时器正在更新 UI 并从 tempData 中读取,但这并没有按预期或希望的那样工作。
定时器:
myTimer.Interval = 1000;
myTimer.Tick += FileReadFunction;
aTimer.Elapsed += new System.Timers.ElapsedEventHandler(prepData);
aTimer.Interval = 1000;
启动计时器的按钮点击:
private void _tbStartAll_Click(object sender, EventArgs e)
{
lock (_hosts)
{
foreach (HostPinger hp in _hosts)
hp.Start();
myTimer.Start();
aTimer.Enabled = true;
}
}
表格数据的准备方法Class:
public void prepData(object objectInfo, EventArgs e)
{
foreach (NetPinger.source.AddGraph b in graphList)
{
b.prepareData();
}
}
准备数据方法:
public void prepareData()
{
double unixTimestamp = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
for (double i = unixTimestamp; unixTimestamp - graphSizing < i; i--)
{
bool exists;
try
{
exists = Array.Exists(file, element => element.XValue == i);
exists = true;
}
catch
{
exists = false;
}
try
{
if (exists == false)
{
TempBuffer = TempBuffer.Skip(1).Concat(new DataPoint[] { new DataPoint(i, 0) }).ToArray();
}
else
{
DataPoint point = Array.Find(file, element => element.XValue == i);
TempBuffer = TempBuffer.Skip(1).Concat(new DataPoint[] { (point) }).ToArray();
}
}
catch (Exception ex)
{
//just for debugging...
}
}
}
表格中的文件读取方法Class:
private void FileReadFunction(object objectInfo, EventArgs e)
{
foreach (NetPinger.source.AddGraph b in graphList)
{
b.fileRead();
}
}
方法文件读取/更新图表:
public void fileRead()
{
//double unixTimestamp = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
chart_holder.Series[0].Points.Clear();
foreach (DataPoint a in TempBuffer)
{
chart_holder.Series[0].Points.Add(a);
}
}
时间同步的图片示例:
我有点想不通为什么它不起作用,是因为一个线程比另一个线程快吗?或者是什么原因,我该如何解决?非常感谢你的帮助。
你好C.User
我通过稍微更改代码解决了这个问题。为了保持同步,我首先准备数据,然后再显示它。数据准备好后,所有数据都会显示出来。另外,我现在只使用一个计时器,而不是两个。