Надежные измерения коротких промежутков времени в Windows

Мне нужен код, который будет обеспечивать "Ticks" ровно 10 миллисекунд, и я сбит с толку из-за множества статей, некоторые из которых противоречат другим относительно того, как это сделать в Windows.

Мне удалось выполнить первый шаг — с помощью мультимедийного таймера обеспечить сон на 1 миллисекунду.

Есть ли способ гарантировать, что спящий код будет работать на всех машинах. IsHighResolution: true или false, однопроцессорные или многопроцессорные системы и т. д.?

[edit] Предыдущий вопрос, касающийся проблемы с использованием StopWatch в многоядерной системе: Multicore и thread знаешь секундомер .Net? [/edit]


person Joezer    schedule 20.04.2015    source источник
comment
Вы хотите измерить эти тики или вы хотите вызывать код в эти интервалы? Во-первых, самое лучшее решение — использовать секундомер.   -  person Georg    schedule 20.04.2015
comment
@Georg - вызывать метод на точных интервалах. Кроме того, вы, похоже, не знаете о проблеме с секундомером, посмотрите ссылку, которую я добавил в вопрос.   -  person Joezer    schedule 20.04.2015
comment
@Maimonides Эти проблемы, как правило, не возникают на последних процессорах (то есть за последние 5 лет), но в любом случае их можно исправить, установив сходство потоков. Но это не позволит вам спать в течение точного количества миллисекунд.   -  person Matthew Watson    schedule 20.04.2015
comment
@MatthewWatson - Хорошие новости о новых процессорах! но как я могу добиться короткого сна? У меня есть циклы вычислений, после завершения которых мне нужно спать оставшееся время до следующего цикла. Я подумал об занятом ожидании, но предпочел бы другой метод, если это возможно.   -  person Joezer    schedule 20.04.2015
comment
@Maimonides Поскольку Windows не является операционной системой реального времени, на самом деле вы не можете гарантировать точность в миллисекундах в ожидании. Вы можете сделать это в большинстве случаев, но иногда это может не сработать.   -  person Matthew Watson    schedule 20.04.2015


Ответы (1)


извините, что я не могу написать это в комментариях... Если у вас есть возможность использовать второй поток, вы можете использовать цикл, чтобы тратить время... вот так:

    class yourTimer{ 
    public  void startTimer(Action a)
    {
        ParameterizedThreadStart fu = new ParameterizedThreadStart(waiter);
        Thread t1 = new Thread(fu);
        t1.Start(a);
    }
    public void stopTimer()
    private void waiter(object o)
    {
        Action ac = (Action)o;
        while(waitin)
        {
            if(DateTime.Now.Millisecond%10==0)
            {
                ac.Invoke();
            }
            continue;
        }
    }
  }

но это довольно уродливое решение, я думаю...

person leAthlon    schedule 09.05.2015