private static extern uint timeSetEvent( uint uDelay, uint uResolution, [MarshalAs(UnmanagedType.FunctionPtr)] MmTimerProc lpTimeProc, uint dwUser, int fuEvent );
public static uint SetTimer(int delay, int resolution, MmTimerProc callback, int user, int eventType) { Thread schedulerThread = new Thread(() => ScheduleThread(delay, callback, (TimerEventType)eventType)); SchedulerCatalog.Add(schedulerThread); schedulerThread.Start(); return((uint)SchedulerCatalog.IndexOf(schedulerThread)); }
private static void ScheduleThread(int fireTime, MmTimerProc callback, TimerEventType schedulerType) { try { Stopwatch sw = new Stopwatch(); repeatSchedule: sw.Start(); while (sw.ElapsedMilliseconds < fireTime) { Thread.Sleep(1); } sw.Reset(); callback((uint)SchedulerCatalog.IndexOf(Thread.CurrentThread), 0, IntPtr.Zero, 0, 0); if (schedulerType == TimerEventType.TIME_PERIODIC) { goto repeatSchedule; } } catch (ThreadInterruptedException e) { Console.WriteLine($"Thread interrupted (callback={callback.Method.Name}())"); } }
public WinMmTimer(int frequency) { _callback = (timerid, msg, user, dw1, dw2) => Tick?.Invoke(null, EventArgs.Empty); _frequency = frequency; }
public NativeTimer(MmTimerProc callback, int frequency) { _callback = callback; _frequency = frequency; }