Ich versuche, einen Rückruf alle N Millisekunden (idealerweise 1) auf OSX. Ich habe ein CFRunLoop
und dann hinzugefügt, um eine Timer wie so ein:Regelmäßige Timer-Callbacks auf OSX
const double period = 0.001;
CFAbsoluteTime now = CFAbsoluteTimeGetCurrent();
CFRunLoopTimerContext context;
std::memset(&context, 0, sizeof(context));
context.info = ...;
CFRunLoopTimerRef timerRef = CFRunLoopTimerCreate(kCFAllocatorDefault, now + period, period, 0, 0, RunLoopTimerCallBack, &context);
// Add it to the loop.
CFRunLoopAddTimer(/* my run loop reference */, timerRef, kCFRunLoopDefaultMode);
Es scheint zu funktionieren - mein RunLoopTimerCallback()
wird etwa jede Millisekunde genannt. Außer wenn es nicht so ist. Die documentation for CFRunLoopTimerCreate
sagt:
Die feine Präzision (Sub-Millisekunden höchstens) des Intervalls durch den Timer leicht eingestellt werden können, wenn die Umsetzung Gründe, dies zu existieren.
So erwarte ich, dass es mehr oder weniger Arbeit, aber in der Praxis ich Verzögerungen zwischen Rückrufen von bis zu 8 ms:
Ich habe versucht setting the run loop thread to real-time priority aber es hat nicht machen jede Differenz. Hat jemand eine Idee, warum ich diese Verzögerungen bekommen würde? Ich realisiere, dass dies das Betriebssystem ziemlich hart treibt und vielleicht ist es etwas Planung, aber immer noch ... 1 Millisekunde ist nicht , dass kurz.