J'essaie d'obtenir un rappel toutes les N millisecondes (idéalement 1) sur OSX. J'ai mis en place un CFRunLoop
puis ajouté une minuterie comme ceci:Rappels de minuterie réguliers sur 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);
Il semble fonctionner - mon RunLoopTimerCallback()
est appelé à peu près toutes les millisecondes. Sauf quand ce n'est pas le cas. Le documentation for CFRunLoopTimerCreate
dit:
La précision fine (sous-milliseconde au plus) de l'intervalle peut être légèrement ajustée par la minuterie si des raisons de mise en œuvre pour y parvenir existent.
donc je pense que cela fonctionne plus ou moins, mais dans la pratique je reçois des retards entre callbacks jusqu'à 8 ms:
J'ai essayé setting the run loop thread to real-time priority mais il n'a pas fait toute différence. Est-ce que quelqu'un a une idée de la raison pour laquelle j'aurais ces retards? Je me rends compte que cela pousse l'OS assez dur et peut-être que c'est quelque chose de planification, mais quand même ... 1 milliseconde n'est pas que court.