Проблема таймера WPF ... Невозможно получить правильный тик миллисекунды - PullRequest
2 голосов
/ 06 июля 2010

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

Я использую WPF и мне интересно, почему следующее не работает правильно.

Похоже, что "секунда""Обратный отсчет работает правильно, но при использовании той же процедуры и редактировании одного значения, он не" правильно ставит галочку ", как кажется.

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

            //TimeSpan temp0 = new TimeSpan(0, 0, 0, 0, 1);
        CountdownTimer = new DispatcherTimer();
        CountdownTimer.Tick += new EventHandler(Countdowntimer_Tick);
        CountdownTimer.Interval = TimeSpan.FromSeconds(1.0);//temp0;

Вышеприведенное выглядит так, будто оно отлично работает для «второго» обратного отсчета, но мне нужно больше точности, поэтому я делаю следующее:

            //TimeSpan temp0 = new TimeSpan(0, 0, 0, 0, 1);
        IntroCountdownTimer = new DispatcherTimer();
        IntroCountdownTimer.Tick += new EventHandler(Countdowntimer_Tick);
        IntroCountdownTimer.Interval = TimeSpan.FromSeconds(0.001);//temp0;

Это даст нам точность в миллисекундах, НО, когда я пытаюсьэто в моей программе, это намного медленнее.Любые идеи, почему?

    void Countdowntimer_Tick(object sender, EventArgs e)
    {
        m_dIntroCountdown -= 1.0;
    }

ps: я устанавливаю "m_dIntroCountdown соответственно. Если мы находимся в миллисекундах, я устанавливаю его на 5000.0, если в секундах, 5.0

Может быть, я смотрюслишком много в этом .. какие-либо идеи?

Вся помощь приветствуется.

Спасибо!

Ответы [ 3 ]

6 голосов
/ 06 июля 2010

Для чего нужно разрешение?Если вы просто пытаетесь отслеживать время, используйте System.Diagnostics.Stopwatch .Он имеет разрешение ~ 10 нс.

Разрешение по времени в 1 мс слишком хорошо для того, что может обработать WPF.Даже при 120 кадрах в секунду (что является высоким) вы получите разрешение всего 8,3 мс.Для обновления со скоростью 1 мс необходимо отрисовывать 1000 кадров в секунду.Это просто за пределами любой современной системы.Даже человеческий глаз начинает терять след прерывистых изменений в движении через ~ 10 мс.

2 голосов
/ 24 июля 2012

Это код для C #:

using System.Windows.Threading;


public partial class MainWindow
{

    DateTime Time = new DateTime();
    DispatcherTimer timer1 = new DispatcherTimer();

    private void dispatchertimer_Tick(object sender, EventArgs e)
    {
        TimeSpan Difference = DateTime.Now.Subtract(Time);
        Label1.Content = Difference.Milliseconds.ToString();
        Label2.Content = Difference.Seconds.ToString();
        Label3.Content = Difference.Minutes.ToString();
    }

    private void Button1_Click(System.Object sender, System.Windows.RoutedEventArgs e)
    {
        timer1.Tick += new System.EventHandler(dispatchertimer_Tick);
        timer1.Interval = new TimeSpan(0, 0, 0);


        if (timer1.IsEnabled == true)
        {
            timer1.Stop();
        }
        else
        {
            Time = DateTime.Now;
            timer1.Start();

        }
    }

Вот как это сделать:

Добавьте 3 метки и 1 кнопку: Label1, Label2, Label3 и Button1

Это код для Vb (Visual Basic):

Imports System.Windows.Threading

Class MainWindow

Dim timer1 As DispatcherTimer = New DispatcherTimer()
Dim Time As New DateTime

Private Sub dispatchertimer_Tick(ByVal sender As Object, ByVal e As EventArgs)
    Dim Difference As TimeSpan = DateTime.Now.Subtract(Time) 
    Label1.Content = Difference.Milliseconds.ToString
    Label2.Content = Difference.Seconds.ToString
    Label3.Content = Difference.Minutes.ToString
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click
    AddHandler timer1.Tick, AddressOf dispatchertimer_Tick
    timer1.Interval = New TimeSpan(0, 0, 0)


    If timer1.IsEnabled = True Then
        timer1.Stop()
    Else
        Time = DateTime.Now
        timer1.Start()

    End If
End Sub
End Class
0 голосов
/ 06 июля 2010

DispatcherTimer не является высокоточным таймером - это малоточный таймер низкой точности, подходящий для работы пользовательского интерфейса (когда люди не замечают задержек в 100 мс).

Высокоточные таймеры, которые выполняют код каждые 1 мс,очень сложно, может быть, даже невозможно реализовать (что вы делаете, если какой-то другой процесс в системе переходит на 100% ЦП, а ваш процесс не работает более 1 мс? что вы делаете, если код, выполняемый к тому времени, долженбыть перезагружен из файла подкачки, и это займет более 1 мс?).

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