Таймер обратного отсчета C #, нет точности.Ищете другой способ сделать это - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть таймер обратного отсчета, при запуске он отстает на 1 секунду каждые 5 - 10 секунд.Есть ли способ сделать этот таймер обратного отсчета точным по времени системных часов?

Public MAIN()
            timer = new DispatcherTimer();
            timer.Interval = TimeSpan.FromMilliseconds(1000);
            timer.Tick += timer_Tick;



void timer_Tick(object sender, object e)
{
            basetime = basetime - 1;
            txt.Text = string.Format("{0:00}:{1:00}:{2:00}", basetime / 3600, (basetime / 60) % 60, basetime % 60);
            if (basetime == 0)
            {
                timer.Stop();
                Timer_Start.IsEnabled = Timer_Pause.IsEnabled = Timer_Restart.IsEnabled = true;
            }
}

Я хотел бы попробовать несколько разных идей, также мне придется периодически останавливать и запускать таймер, чтобыэто тоже должно быть включено в решение.

Ответы [ 2 ]

0 голосов
/ 01 апреля 2019

Solution;

Запустите секундомер и сравните с ним математику.

PS Я знаю, что есть лучшие способы сделать это и может обновить в будущих выпусках.


        void Timer_Tick(object sender, object e)
         {
            int BaseINMill = basetime * 1000;
            //total of milliseconds left
            basetimeMILL.Text = BaseINMill.ToString() ;
            //Display the total Milliseconds elapsed
            ConsolePost.Text = VerifyMill.ElapsedMilliseconds.ToString();


            if( CorrectionWatch.ElapsedMilliseconds >= 2000)
            {
                PreCorrBaseTime = PreCorrBaseTime - 2;

                //Display the Correction timer Milliseconds elapsed
                Correctiontest.Text = CorrectionWatch.ElapsedMilliseconds.ToString();
                CorrectionWatch.Restart();
                //Show the total time between seconds changing on screen
                ConsoleOutputPre.Text = stopwatch.ElapsedMilliseconds.ToString();
                basetime = PreCorrBaseTime;
                txt.Text = string.Format("{0:00}:{1:00}:{2:00}", basetime / 3600, (basetime / 60) % 60, basetime % 60);
                if (basetime == 0)
                {
                    timer.Stop();
                    Timer_Start.IsEnabled = Timer_Pause.IsEnabled = Timer_Restart.IsEnabled = true;
                    VerifyMill.Stop();
                }
                stopwatch = Stopwatch.StartNew();
            }
            else {
                if (stopwatch.ElapsedMilliseconds >= 975 && stopwatch.ElapsedMilliseconds <=1025 )
                {
                    //Show the total time between seconds changing on screen
                    ConsoleOutputPre.Text = stopwatch.ElapsedMilliseconds.ToString();
                    basetime = basetime - 1;
                    txt.Text = string.Format("{0:00}:{1:00}:{2:00}", basetime / 3600, (basetime / 60) % 60, basetime % 60);
                    if (basetime == 0)
                    {
                        timer.Stop();
                        Timer_Start.IsEnabled = Timer_Pause.IsEnabled = Timer_Restart.IsEnabled = true;
                        VerifyMill.Stop();
                    }
                    stopwatch = Stopwatch.StartNew();
                }

                if (stopwatch.ElapsedMilliseconds >= 1026 && stopwatch.ElapsedMilliseconds <= 2000)
                {
                    //Show the total time between seconds changing on screen
                    ConsoleOutputPre.Text = stopwatch.ElapsedMilliseconds.ToString();
                    basetime = basetime - 1;
                    txt.Text = string.Format("{0:00}:{1:00}:{2:00}", basetime / 3600, (basetime / 60) % 60, basetime % 60);
                    if (basetime == 0)
                    {
                        timer.Stop();
                        Timer_Start.IsEnabled = Timer_Pause.IsEnabled = Timer_Restart.IsEnabled = true;
                        VerifyMill.Stop();
                    }
                    stopwatch = Stopwatch.StartNew();
                }
                if (stopwatch.ElapsedMilliseconds > 2000)
                {
                    ErrorPrompt();
                    VerifyMill.Stop();
                }
            }


        }
0 голосов
/ 01 апреля 2019

Вместо того, чтобы пытаться вычислить время из итератора, вычислите его, используя системные часы.

Изменить тип basetime на DateTime.

Когда вы запускаете таймер, установите базовое время: basetime = DateTime.Now; И установите переменную TimeSpan равной количеству времени для обратного отсчета: countdown = new TimeSpan(/*your code here*/);

Теперь обновите ваш timer_Tick примерно так:

void timer_Tick (object sender, object e)
{
    var now = DateTime.Now;

    // This computes the remaining time and formats it for display
    txt.Text = (now - basetime).ToString("hh:mm:ss");

    // Checks that the timer is complete
    if (now - basetime > countdown)
    {
        /* stop the timer */
    }
}

DispatcherTimer не совсем точен, он приблизителен, что для большинства задач достаточно, но для отслеживания времени недостаточно. Вместо этого вы можете использовать его, чтобы приблизить секунду, а затем обновить свой таймер фактическим временем из системных часов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...