Ich versuche, eine Methode mit einer stabilen Zykluszeit (z. B. 20ms) auszuführen. Mein aktueller Ansatz besteht darin, einen Thread mit std::thread
zu erstellen. Innerhalb dieses Threads ich folgendes (Pseudo-Code) zu tun:Stabile Zykluszeit
while(true)
{
tStart = GetCurrentTime();
ExecuteMethod();
tEnd = GetCurrentTime();
actualCycleTime = tEnd - tStart;
SleepFor(DesiredCycleTime - actualCycleTime);
}
Für die Zeitmessung und Schlafen ich std::chrono
(std::steady_clock
und std::thread::sleep_for
).
Das Problem ist, dass meine Schleife nicht bei den erwarteten stabilen 20 ms ausgeführt wird. Stattdessen erhalte ich Zykluszeiten zwischen 20 und 60ms. Meine Vermutung ist, dass dies durch den Windows-Scheduler verursacht wird.
Gibt es einen besseren Weg, um eine stabile Zykluszeit zu erreichen (busy waiting, etc.)?
Sie verwenden ein wiederholtes relatives Timing, das anfällig für Rennbedingungen zwischen der Bestimmung der tatsächlichen Zykluszeit und der Festlegung der gewünschten Zykluszeit ist. Sie benötigen einen extern gesteuerten periodischen Trigger der gewünschten Zykluszeit. – Yunnosch
Vielleicht möchten Sie sich https://stackoverflow.com/questions/2904887/sub-millisecond-precision-timing-in-c-or-c/2905082#2905082 ansehen. – jodag
timeSetEvent war relativ zuverlässig, wenn es mit timeBeginPeriod verwendet wurde. MSDN sagt, dass es veraltet ist, und Sie sollten https://msdn.microsoft.com/en-us/library/ms682485(v=vs.85).aspx verwenden Ich habe keine Erfahrung damit, also kann ich nicht sagen wie zuverlässig oder genau ist es. –