none
Zyklischer Aufruf RRS feed

  • Frage

  • Hallo !

    Jetzt muss ich mir doch noch etwas von der Seele schreiben, das mich seit Tagen beschäftigt, vielleicht kann mir jemand einen Tipp geben.

    Möchte innerhalb eines Prozesses Hintergrundfunktionen hochprior zyklisch aufrufen (ca. 100ms); dazu wird jeweils ein Threading.Thread angelegt, der eine Prozedur verwaltet, die die Funktion in einer Schleife aufgeruft. Die Schleife wartet auf einen Threading.Semaphore, der in der Callback-Routine eines Threading.Timer gesetzt wird. Das läuft auch soweit, nur schwankt die Zykluszeit stark.

    Nachdem ich gesehen habe, dass die Callback-Routine nur mit normaler Priorität läuft, auch wenn der Timer innerhalb des hochprioren Threads instanziiert wurde, habe ich die Zeitsteuerung komplett in die hochpriore Aufrufprozedur verlegt, indem über Thread.Sleep die Zeit bis zum nächsten Start verschlafen wird. - Das Ergebnis ist genauso unbefriedigend.

    Nach meinem bisherigen Kenntnisstand liegt die Ursache darin, dass die Synchonisationsmechanismen wie Timer und Sleep im Threadpool verwaltet werden, und dort haben alle normale Priorität. Damit wird ein hochpriorer Thread im Zustand WaitSleepJoin duch einen Thread mit niedrigerer Priorität ausgebremst (die Sleep-Time wird verlängert)

    Die Frage ist also schlicht :
    Wie wird ein exakter zyklischer Trigger (+-1 Takt der Threadverwaltung) realisiert ?

    Mittwoch, 1. Juli 2009 06:29

Alle Antworten

  • Hallo,
    ich habe zwar keine Lösung, aber ähnliche Beobachtungen gemacht. Als Notlösung für mein Problem (siehe Thread "Problem mit RS232-Ausgabe") warte ich mit Thread.Sleep auf den Abschluss einer RS232-Ausgabe. Die Ausgabe dauert 5 ms und das Warten klappt auch oft recht gut mit einer Ungenauigkeit von einigen µs.
    Aber manchmal spinnt Thread.Sleep und produziert Wartezeiten von 1 bis 15 ms. Manchmal dauerhaft 15 ms, manchmal laufend wechselnde Zeiten. Diese Zustände (geht/geht nicht) dauern während des ganzen Programmlaufs an. Ich  weiß nicht was der Grund ist. Ich vermute, dass irgend ein anderer Prozess den Ablauf stört. Aber mit so einer Unsicherheit ist Thread.Sleep schlicht unbrauchbar. Vielleicht steckt in meinem System ein Wurm. Eigentlich wollte ich nicht mit einem Oszilloscope Software-Fehler suchen, aber nur so habe herausgefunden, warum meine Kommunikation nicht funktioniert.

    Vielleicht hat jemand einen Tipp, wie man ein stabiles Thread.Sleep hinkriegt. Das würde vermutlich auch Dein Problem lösen.

    Gruß Hermi2
    Montag, 20. Juli 2009 08:51