Если вы посчитаете каждый оборот, вы можете создать свой собственный 64-битный TickCount, который будет полезен для 2 ^ 63 мс (292 миллиона лет) или 2 ^ 64 мс (585 миллионов лет). Если вам не нужна полная точность 1 мс (фактически только разрешение 10-16 мс) или диапазон, вы можете разделить результат на 1000 и представить до 49 710 дней (136 лет) с разрешением в одну секунду в UInt32.
GetTickCount64()
делает это для вас, но доступно только в Vista или более поздней версии.
Здесь я считаю периоды прошедшего времени, а не TickCount.
// C# (untested)
...
// Initialize and start timer:
uint uiT0 = unchecked((uint)Environment.TickCount); // T0 is NOW. // ms since boot, 10-16ms res.
uint uiElapsedPrev = 0;
uint uiWrapCount = 0;
...
long x = GetElapsedTime();
public static long GetElapsedTime()
{
uint uiElapsed = unchecked((uint)Environment.TickCount - uiT0) // 0 to +49.71 days
if (uiElapsed < uiElapsedPrev) // IF uiElapsed decreased,
uiWrapCount++; // increment the wrap counter.
uiElapsedPrev = uiElapsed; // Save the previous value.
return ( ((long)uiWrapCount << 32) + (long)uiElapsedPrev );
}
AND с Int32.MaxValue не требуется и является плохим примером в документации .NET. Непроверенное вычитание 32-битных целых чисел безопасно переполняется. Знак Environment.TickCount никогда не имеет значения. Вычитание обрабатывает все случаи, которые обертывают вокруг. Пример, перенос по одному: uiT0 = Int32.MaxValue; iTickNow = uiT0 + 1 приводит к Int32.MinValue; наконец, (iTickNow - uiT0) дает 1.
uiElapsed следы истекли время до 49,7 дней, прежде чем оно обнуляется. Каждый раз, когда это происходит, iWrapCount увеличивается. GetElapsedTime () должен вызываться не реже одного раза в 49,7 дня, чтобы обход не обнаруживался.