Миллисекунды в DateTime. Теперь на.NET Компактная Платформа всегда обнуляют?

я хочу иметь метку времени для входа в систему проект Windows Mobile. Точность должна быть в диапазоне ста миллисекундами, по крайней мере.

Однако мой вызов к DateTime.Now возвраты a DateTime объект с Millisecond набор свойств для обнуления. Также Ticks свойство округлено соответственно.

Как получить лучшую точность времени?
Помните, что мой код работает на Компактной Платформе, версии 3.5. Я использую сенсорное устройство Pro 2 HTC.

На основе ответа от MusiGenesis я создал следующий класс, который решил эту проблему:

/// <summary>
/// A more precisely implementation of some DateTime properties on mobile devices.
/// </summary>
/// <devdoc>Tested on a HTC Touch Pro2.</devdoc>
public static class DateTimePrecisely
{
    /// <summary>
    /// Remembers the start time when this model was created.
    /// </summary>
    private static DateTime _start = DateTime.Now;
    /// <summary>
    /// Remembers the system uptime ticks when this model was created. This
    /// serves as a more precise time provider as DateTime.Now can do.
    /// </summary>
    private static int _startTick = Environment.TickCount;

    /// <summary>
    /// Gets a DateTime object that is set exactly to the current date and time on this computer, expressed as the local time.
    /// </summary>
    /// <returns></returns>
    public static DateTime Now
    {
        get
        {
            return _start.AddMilliseconds(Environment.TickCount - _startTick);
        }
    }
}
13
задан spoulson 9 April 2010 в 13:56
поделиться

3 ответа

Environment.TickCount вернет количество миллисекунд, в течение которых Windows (или Windows Mobile) работала с момента последней перезагрузки.

Чтобы использовать это, добавьте эти две переменные уровня формы в свой код:

private DateTime _start;
private int _startTick;

В событии Load вашей формы сделайте следующее:

private void Form1_Load(object sender, EventArgs e)
{
    _start = DateTime.Now;
    _startTick = Environment.TickCount;
}

Когда вам понадобится объект DateTime с миллисекундами, сделайте следующее:

DateTime timeStamp = 
    _start.AddMilliseconds(Environment.TickCount - _startTick);

Environment. TickCount - это int , и это значение будет "обернуто" до Int32.MinValue примерно через 25 дней. Если ваше устройство будет работать так долго без перезапуска, вы захотите добавить проверку для значения Environment.TickCount , которое меньше последнего прочитанного значения, и сбросить оба _start и _startTick , если это так.

14
ответ дан 2 December 2019 в 00:31
поделиться
2
ответ дан 2 December 2019 в 00:31
поделиться

Основной альтернативой является класс System.Diagnostics.Stopwatch.

Он доступен в CE, но обратите внимание на свойство IsHighResolution. Вероятно, на вашем устройстве оно равно False, но проверьте.

Это настолько точно, насколько вы можете получить без P/Invoke.

1
ответ дан 2 December 2019 в 00:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: