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.
Rufus Τ. Firefly schrieb: > Und da kommt man nicht an die Interrupts 'ran. nun ja, aber man kann sehr wohl Timer programmieren. Hier ein Beispiel: http://www.andreadrian.de/c-workshop/#mozTocId722365
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.
*GAST* schrieb: > Aber ja, es ist richtig, ich programmiere in C unter Windows XP. Dann sieh Dir timeSetEvent genauer an: http://msdn.microsoft.com/en-us/library/windows/desktop/dd757634%28v=vs.85%29.aspx
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.