System.Timers.Timer only gives maximum 64 frames per second
.net, c#, timer, winforms
Solution
Try Multimedia Timers - they provide greatest accuracy possible for the hardware platform. These timers schedule events at a higher resolution than other timer services.
You will need following Win API functions to set timer resolution, start and stop timer:
[DllImport("winmm.dll")]
private static extern int timeGetDevCaps(ref TimerCaps caps, int sizeOfTimerCaps);
[DllImport("winmm.dll")]
private static extern int timeSetEvent(int delay, int resolution, TimeProc proc, int user, int mode);
[DllImport("winmm.dll")]
private static extern int timeKillEvent(int id);
You also need callback delegate:
delegate void TimeProc(int id, int msg, int user, int param1, int param2);
And timer capabilities structure
[StructLayout(LayoutKind.Sequential)]
public struct TimerCaps
{
public int periodMin;
public int periodMax;
}
Usage:
TimerCaps caps = new TimerCaps();
// provides min and max period
timeGetDevCaps(ref caps, Marshal.SizeOf(caps));
int period = 1;
int resolution = 1;
int mode = 0; // 0 for periodic, 1 for single event
timeSetEvent(period, resolution, new TimeProc(TimerCallback), 0, mode);
And callback:
void TimerCallback(int id, int msg, int user, int param1, int param2)
{
// occurs every 1 ms
}
Problem
I have an application that uses a System.Timers.Timer object to raise events that are processed by the main form (Windows Forms, C#). My problem is that no matter how short I set the .Interval (even to 1 ms) I get a max of 64 times per second. I know the Forms timer has a 55 ms accuracy limit, but this is the System.Timer variant, not the Forms one. The application sits a 1% CPU, so it's definitely not CPU-bound. So all it's doing is: - Set the Timer to 1&nsp;ms - When the event fires, increment a _Count variable - Set it to 1&nsp;ms again and repeat _Count gets incremented a maximum of 64 times a second even when there's no other work to do. This is an "playback" application that has to replicate packets coming in with as little as 1-2 ms delay between them, so I need something that can reliably fire 1000 times a second or so (though I'd settle for 100 if I was CPU bound, I'm not). Any thoughts?