猿问

C# WinForms 试图保持时间线同步

您好,我正在尝试每秒更新我的图表,所有图表应始终同时进行。为了更好地理解,我将包含一个图像,但首先我将解释实际发生的情况。


所以我正在发送 ping 请求,每次有结果时,它都会将其写在一个名为 file 的数据点数组中。一切正常,按预期工作。


同时,两个计时器正在运行,一个计时器调用一个准备数据的方法(假设在特定时间在数组中找不到数据 -> 它应该只设置值 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;

            }

        }

Form类中准备数据的方法:


 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();

                    }



红颜莎娜
浏览 183回答 1
1回答

倚天杖

我通过稍微更改代码解决了这个问题。为了保持同步,我首先准备数据,然后再显示它。数据准备好后,所有数据都会显示出来。此外,我现在只使用一个计时器而不是两个。
随时随地看视频慕课网APP
我要回答