У меня есть поток для создания сетевого пакета каждые 40 мс (25 Гц), это бесконечный цикл (до тех пор, пока он не будет остановлен), и я использую thread.sleep.DateTime drifting - weird issue через 2 часа
Когда я создаю пакет, одним из значений является текущее время GPS, используя DateTime.UtcNow
и добавляя секунды прыжка.
Это работает отлично, когда я начинаю, но он дрейфует со временем, примерно через 2 часа, он отстает на 5 секунд.
У меня есть Symmetrom GPS Time Server, и я использую их программное обеспечение как клиент NTP, и он говорит, что совокупный дрейф на ПК составляет около 1,2 секунды (большая часть из того, что я заметил, является дрейфом, а ПК выключен и не синхронизирован с NTP).
У кого-нибудь есть идеи, что происходит не так? Я знаю, что thread.sleep - это не идеальное время, и Windows - это не RTOS, но дрейф не имеет смысла, если отбросить кадры.
Я не могу отправить код из-за некоторые патентованные и ИТАР вопросов, но я могу опубликовать примерный план:
while(!abort) {
currentTime = DateTime.UtcNow + leapSeconds ;
buildPacket(currentTime);
stream.Write(msg, 0, sendSize);
//NetworkStream Thread.Sleep(40);
}
Я в Windows 7 и с помощью Visual Studios 2010.
Вы используете 'Sleep (40)', а затем что-то делаете? Учтите, сколько времени требуется для сборки пакета? –
Сообщите нам ваш код? –
Я бы сказал, что 5 секунд не так уж плохо, учитывая, что у вас было более 180 тысяч тиков. Даже очень небольшая неточность в Thread.Sleep ([и это действительно не идеально) (http://stackoverflow.com/a/1303708/2316200)) приведет к большому интервалу с течением времени. Это еще хуже с Windows.Timers, где вы можете получить 10 секунд после примерно 30 минут. –