C # Стробоскоп, Thread.Sleep - PullRequest
       12

C # Стробоскоп, Thread.Sleep

2 голосов
/ 09 января 2011

Я делаю простой стробоскоп, прикрепленный к компьютеру. У меня есть петля Вот так:

double SleepTime = 1000 / Hz;

while ()
{
    BlinkAll();
    Thread.Sleep((int)SleepTime);
}

Но это очень неточно. Если Гц = 666 чем SleepTime = 1,5 а также (int) SleepTime = 1

это означает, что на выходе я получаю 1000 Гц, а не 666 Гц. Это большая разница.

Как это исправить?

приписка

Этот пример все еще не точен. Лучше, но никак не хорошо:

double SleepTime = 1000 / Hz;
Thread.Sleep((int)SleepTime + 0.5)

Ответы [ 3 ]

2 голосов
/ 09 января 2011

Взгляните на NtDelayExecution (ntdll.dll) ... кажется, что он имеет лучшую гранулярность (единицы в 100 нс, а не 1 мс), хотя я не уверен, сколько это будетпомогите, потому что я думаю, что потоки в Windows занимают несколько миллисекунд времени каждый.

0 голосов
/ 09 января 2011

Как насчет чего-то вроде:

using System;
using System.Threading;
using System.Diagnostics;

static class Program
{
    static void Main()
    {
        const int Hz = 666;
        var t0 = DateTime.Now;
        int nCycles = 0;
        var sw = Stopwatch.StartNew();
        while (sw.ElapsedMilliseconds < 10000)
        {
            ++nCycles;
            var time = t0 + TimeSpan.FromMilliseconds(nCycles * 1000 / Hz);
            var ttw = (int)((time - DateTime.Now).TotalMilliseconds);
            if (ttw >= 1)
                Thread.Sleep(ttw);
        }
        Console.WriteLine(nCycles);
    }
}
0 голосов
/ 09 января 2011

вы пробовали с System.Timers.Timer ?Я считаю, что это намного точнее и допускает миллисекунды, поэтому вы можете быть весьма точными

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