Threadpausen im niedrigen ms-Bereich erreichen



  • Hiho,

    ich habe eine recht echtzeitnahe Anwendung, welche periodisch Daten von einer Maschinensteuerung bekommt und diese verarbeitet. Die Taktzeiten liegen im Bereich 2-3 ms.
    Die eigentliche Verarbeitung ist recht fix (< 1ms). Wenn ich jetzt nach neuen Daten polle, funktioniert das natürlich, lastet aber eine CPU stark aus, wo er letztlich in einer Schleife nur prüft, ob neue Daten da sind.
    Jetzt kann ich natürlich ein Sleep(0) machen, das richtet sich aber nach der global eingerichteten Zeitscheibe in Windows, wodurch man meistens irgendwo bei einer Pause zw. 20-30 ms liegt (je nach konkreter BS_Version). Das lässt sich natürlich mit ::timeBeginPeriod beeinflussen und nach unten setzen, gilt dann aber betriebssystemweit.

    Meine Frage ist: gibt es noch andere Vorgehensweisen, wie man das Szenario abbilden kann, oder habe ich nur die beiden schon beschriebenen Varianten pollen oder Sleep + Zeitscheibe sehr klein setzen?

    VG

    Pellaeon



  • Hier wird auf das Problem weiter eingegangen, eine brauchbare Lösung gibt es wohl erst ab Windows 10 1803 mit CreateWaitableTimerExW und dem Flag HIGH_RESOLUTION_TIMER. Weiter unten im Artikel sind auch Tests und Beispiele verlinkt, schau's dir mal an, vielleicht hilft`s dir weiter.



  • Hast du hier https://stackoverflow.com/questions/9518106/winapi-sleep-function-call-sleeps-for-longer-than-expected?rq=1 und hier https://stackoverflow.com/questions/3141556/how-to-setup-timer-resolution-to-0-5-ms schon geschaut? Die Funktion NtSetTimerResolution (von ntdll.lib) dürfe das Zauberwort sein.

    Warum ist das so? Das steht oben im ersten Link:

    Window's thread scheduler works on a time quantum (exact length depends of various factors including Windows version and edition). Effectively any non-zero delay is rounded up to a complete quantum.


Anmelden zum Antworten