Moin,
ich möchte gerne für Messzwecke (Abtastrate 4 Hz) einen Thread oder
Ähnliches generieren, der exakt alle 1/4 s ein fprintf aufruft und Daten
in eine Datei schreibt.
Im Prinzip würde das wohl mit einem Thread gehen in dem der
fprintf-Befehl und ein Delay(0.25) in einer Endlosschleife steht, aber
ich möchte berücksichtigen, dass fprintf ein bisschen dauert und ich so
eine Zykluszeit von 0.25 s + fprintf-Dauer habe.
Wie kann man soetwas realisieren?
Zu Beginn des Zyklusses die genaue Zeit bestimmen, Aktivität ausführen,
wieder genaue Zeit bestimmen, Differenz zwischen beiden Zeiten
bestimmen, diese von der gewünschten Intervalldauer abziehen und das
Resultat an "Delay" übergeben.
Rufus Τ. Firefly schrieb:> Zu Beginn des Zyklusses die genaue Zeit bestimmen, Aktivität ausführen,> wieder genaue Zeit bestimmen, Differenz zwischen beiden Zeiten> bestimmen, diese von der gewünschten Intervalldauer abziehen und das> Resultat an "Delay" übergeben.
ein wenig zu kompliziert, meinst du nicht?
Viel einfacher wäre es doch einen Interrupt alle 0,25s losfeuern zu
lassen, der dann die entsprechende Funktion aufruft, oder?
Da der Threadstarter von Threads redet, gehe ich vom Vorhandensein
eines Betriebssystems aus, und da das hier unter "PC-Programmierung" zu
finden ist, erst recht.
Und da kommt man nicht an die Interrupts 'ran.
Am nächsten kommt man dem Ansatz unter Windows durch Einsatz der
multimediatimer, hier kann mit timeSetEvent eine zyklisch aufzurufende
Callbackfunktion eingerichtet werden.
Diese läuft allerdings in einem eigenen Thread, was eine entsprechend
threadsichere Laufzeitumgebung voraussetzt.
Das ist Linux, aber diese Timer haben mit Interrupts und echten
Timerbausteinen auch nur noch sehr entfernt etwas zu tun.
Da der Threadstarter sich nicht darüber ausgelassen hat, welches
Betriebssystem er nutzt, können wir Deinen Beitrag als wertvolle
Ergänzung meines generischen und Windows-Vorschlages ansehen.
Rufus Τ. Firefly schrieb:> Das ist Linux,...
ich programmiere nur unter dieser Plattform...
> aber diese Timer haben mit Interrupts und echten> Timerbausteinen auch nur noch sehr entfernt etwas zu tun.
stimmtnur ganz entfernt, aber ich denke diese Systematik würde das tun,
was der TS eigentlich will.
Rufus Τ. Firefly schrieb:> können wir Deinen Beitrag als wertvolle> Ergänzung meines generischen und Windows-Vorschlages ansehen.
Danke :-)!
Rufus Τ. Firefly schrieb:> Das ist Linux, aber diese Timer haben mit Interrupts und echten> Timerbausteinen auch nur noch sehr entfernt etwas zu tun.
Naja, diese Timer senden Signale, und die kann man als das
Userspace-Pendant zu Interrupts sehen. Die Verwendung ist doch sehr
ähnlich.
> Da der Threadstarter sich nicht darüber ausgelassen hat, welches> Betriebssystem er nutzt, können wir Deinen Beitrag als wertvolle> Ergänzung meines generischen und Windows-Vorschlages ansehen.
Möglichkeiten dazu bietet eigentlich so ziemlich jedes Betriebssystem.
Die Variante, die verbrauchte Zeit zu messen und von der Periodendauer
abzuziehen, um eine Wartezeit auszurechnen ist auch eher Murks, weil
auch da Fehler enthalten, die sich aufaddieren. Bei einem Zyklustimer
dagegen passiert das nicht.
Rolf Magnus schrieb:> Möglichkeiten dazu bietet eigentlich so ziemlich jedes Betriebssystem.> Die Variante, die verbrauchte Zeit zu messen und von der Periodendauer> abzuziehen, um eine Wartezeit auszurechnen ist auch eher Murks,
wenn man es richtig macht dann nicht. Man muss nur einmal die Zeit
ermittlen und kann sich damit dann immer den nächsten start ausrechnen.
Man darf nicht jedes mal die aktuell zeit ausrechnen.
x = time()
while ( true ) {
x = x + (wartezeit)
wait( x - time() )
}
Peter II schrieb:> wenn man es richtig macht dann nicht. Man muss nur einmal die Zeit> ermittlen und kann sich damit dann immer den nächsten start ausrechnen.> Man darf nicht jedes mal die aktuell zeit ausrechnen.
hmm, ... und wer garantiert, dass die Ausführungszeit immer konstant
ist? Dazu müßte der Prozessor immer die gleiche Auslastung haben, was
nun wahrlich nicht gegeben ist.
Deshalb halte ich meinen Vorschlag am sinnvollsten, denn hier wird die
Zeit vom Systemtakt des Kernels angeleitet, die immer konstant sein
sollte.
Mr. Interrupt schrieb:> hmm, ... und wer garantiert, dass die Ausführungszeit immer konstant> ist? Dazu müßte der Prozessor immer die gleiche Auslastung haben, was> nun wahrlich nicht gegeben ist.
niemand, muss sie auch nicht. Schau dir das Beispiel an.
...wie auch immer. Derzeit führen wir eine rein akademische Diskussion,
an der sich der Fragesteller nicht weiter beteiligt, um weiteren Input
zu geben. Lassen wir das Thema einfach mal ruhen, bis er sich wieder
meldet...
Peter II schrieb:> Man muss nur einmal die Zeit> ermittlen und kann sich damit dann immer den nächsten start ausrechnen.> Man darf nicht jedes mal die aktuell zeit ausrechnen.
Doch, das muss man sogar, da die Aktivität, die ausgeführt wird,
durchaus unterschiedlich lange dauern kann.
Danke für die vielen und teilweise wirklich konstruktiven Beiträge! Ich
muss mich jetzt erstmal bisschen sortieren und durch die ganzen
Informationen durchsteigen ;)
Aber ja, es ist richtig, ich programmiere in C unter Windows XP.