using System; using System.Runtime.InteropServices; using System.Threading; namespace VictusLauncher { public static class Timing { private const String Winmm = "winmm.dll"; private const String Kernel32 = "kernel32.dll"; [DllImport(Winmm)] private static extern UInt32 timeBeginPeriod(uint period); [DllImport(Kernel32)] private static extern Boolean QueryPerformanceCounter(out long performanceCount); [DllImport(Kernel32)] private static extern Boolean QueryPerformanceFrequency(out long frequency); private static readonly Int64 Freq; static Timing() { timeBeginPeriod(1); QueryPerformanceFrequency(out Freq); } public static Int64 GetTimestamp() { Int64 result; QueryPerformanceCounter(out result); return result; } public static Int64 DeltaMicroseconds(Int64 earlyTimestamp, Int64 lateTimestamp) { return Freq != 0 ? ((lateTimestamp - earlyTimestamp) * 1000000) / Freq : 0; } public static Int64 DeltaMilliseconds(Int64 earlyTimestamp, Int64 lateTimestamp) { return Freq != 0 ? ((lateTimestamp - earlyTimestamp) * 1000) / Freq : 0; } public static Int64 DeltaSeconds(Int64 earlyTimestamp, Int64 lateTimestamp) { return Freq != 0 ? (lateTimestamp - earlyTimestamp) / Freq : 0; } public static void Sleep(Int32 delay) { Int64 elapsed = 0; Int64 before = GetTimestamp(); while (delay > elapsed) { Thread.Sleep(delay); elapsed = DeltaMicroseconds(before, GetTimestamp()); } } } }