Archiv verlassen und diese Seite im Standarddesign anzeigen : Timer
Stefan75
19-06-2006, 14:35
Hallo zusammen,
ich mache z.Z. ein Praktikum und erstelle ein Prog. in Microsoft Visual C++ das eine Datei ausliest, Frames erkennt und diese über UDP versendet. Es wird remote (auch über UDP) gesteuert und soll zwischen dem Senden zweier Frames auf "stop" reagieren, indem das weitere Auslesen und Senden unterbrochen wird.
In jedem ausgelesenen Frame steckt in 4 Byte die Zeit in Millisekunden (Timestamp) die der Frame nach Programmstart losgeschickt werden soll. Also: Startzeit des Prog. + Timestamp == Sendezeit des Frames
Ich bin Anfänger und habe mir sagen lassen dass ich dazu einen Timer brauche.
Meine Fragen nun:
1. Wie erstelle ich den Timer?
2. In welchen Datentyp stecke ich den "Timestamp" (also die 4Byte millisekundeninformation)?
Besten Dank schonmal
Stefan
Timer sind ne boese sache bei systemen wie Standard Linux oder standard windows.
Die genauigkeit wird also immer vom stand des schedulers + nem lastverhalten abhaengig sein
Alternativen sind halt echtzeitbetriebssysteme, wenn manns genauer haben will ....
Timer baut man fuer sowas am besten mit threads ....
unter windows suchst da am besten nach begriffen wie:
CriticalSection, Event, WaitForSingleObject, WaitForMultiObject. CreateThread .....
Damit kann man aber ganze buecher fuellen ueber das thema ...
Glaub nich das dir nen "einfacher" Timer (ueber die windows MsgPump) bei deinem problem hilft, wenn ich die aufgebenstellung richtig interbretiere ...
"timestamps" unter windows in deinem context gibt es nicht.
Entweder arbeitet das BS mit nem eigenen typ bei groben sachen (time_t)
oder es verwendet den Zaehler vom rtc_register des prozessors, das ist dann nen _int64 mit ner von der frequenz abhaengigen aufloesung
da du nen eigenen cotext hasst, also zeiten soweiso in ms umrechnen musst, bist da eh unabhaengig ....
da du ueber netzwerk arbeitest, also von der plattform unabhaengig, solltest nen typ nehmen der nich mit dem System skaliert. also nen byte[4], oder unsigned _int32 oder sowas ^^
Compilertypen und deren abhaengigkeiten (int long size_t) skalieren miest halt mit dem system und haben nur die mindestgroesse definiert.
Ciao ...
Stefan75
20-06-2006, 12:12
Besten Dank schonmal bis hier...
Timer sind ne boese sache...Die genauigkeit wird also immer vom stand des schedulers + nem lastverhalten abhaengig sein
Meinst Du damit das Timer in Verbindung mit ms generell eine schlechte Mischung sind? Meine Aufgabe ist halt nun mal dies mit einem Timer zu lösen und es muss ja nicht auf die ms genau sein :)
Timer baut man fuer sowas am besten mit threads ....
unter windows suchst da am besten nach begriffen wie:
CriticalSection, Event, WaitForSingleObject, WaitForMultiObject. CreateThread .....
Kann ich da nicht einfach irgendeinen fertigen Timercode verwenden?
Glaub nich das dir nen "einfacher" Timer (ueber die windows MsgPump) bei deinem problem hilft, wenn ich die aufgebenstellung richtig interbretiere ...
Also ich stelle mir das gar nicht so kompliziert vor. Auf die Systemzeit kann ich ja wsl. verzichten oder? Dann brauche doch eigentlich nur nen Timer (da gibt es doch zwei grundsätzliche Typen?) der nach ein paar ms eine Aktion auslöst. (welche am Ende einen neuen Timer setzt)
PS: Kennt jemand einen Link zu deutschen C++Timerinformationen?:confused:
Meinst Du damit das Timer in Verbindung mit ms generell eine schlechte Mischung sind? Meine Aufgabe ist halt nun mal dies mit einem Timer zu lösen und es muss ja nicht auf die ms genau sein
Noe, timer nimmt man unter windows wie unter linux genau so haeufig her, iss nur ne frage der zuverlaessigkeit und genauigkeit die man erwartet ....
Meistens sind die Anforderungen nich so hoch, das heisst wenn das system eh grad beschaeftigt iss intressiert einem der timer auch nicht grad ....
Kann ich da nicht einfach irgendeinen fertigen Timercode verwenden?
einige blibiotheken hamm sowas fertig drinne .... QT zum beispiel.
Ob es ne bib gibt die nur sowas zur verfuegung stellt ... glaub ich eher nich. timer anforderungen sind da meiner meinung nach, sobald man soweiso die wm_timer schiene verlaesst, zu verschieden, zu plattformabhaengig, als das man was da effektiv unter einen hut bekommen wuerde ....
code beispiele :
such mal unter sourceforge.net z.b.
Dann brauche doch eigentlich nur nen Timer (da gibt es doch zwei grundsätzliche Typen?) der nach ein paar ms eine Aktion auslöst. (welche am Ende einen neuen Timer setzt)
Wie angedeutet unter windwos gibt es 2 Ansaetze:
Timer fuer arme ^^ :
man benutzt ne windows(API) interne funktion zum erzeugen eines timers. Dieser erzeugt immer wenn er kann und darf ne wm_timer nachricht in der msg queue des fensters, die man (als ereignis) quasi abfragen kann.
vorteile:
- sehr einfach zu implementieren
- man braucht keinen eigenen thread, man muss seine anwendunf ned fuer mt absichern -> sehr erhebliche vereinfachung des ganzen
nachteile:
- man braucht ne msg-pump, und damit nen fenster (auch wenns unsichtbar sein kann) um ueberhaupt die nachricht abgreifen zu koennen
- das timing verhalten iss nich nur vom stand des BS , sondern auch vom verhalten der eigenen application abhaengig. Sprich wenn deine msg queue zugemuellt ist, kannst lange auf dein wmtimer warten.
- andersrum aber auch, solange dein wmtimer beschaeftigt ist, steht deine Application quasi. Iss aber nich sinn von timer funktionen, den thread sehr lange zu blockieren.
demgegenueber steht die impl mit eigenenem thread:
vorteil:
- genauer, da nur vom BS, nich von der eigenen anwendung abhaengig. (der scheduler vom BS ist fuer die threadsteuerung verantwortlich)
- man braucht kein fenster, geht also komplett ohne gui
Nachteile:
- sehr viel mehr aufwendiger
- man braucht mt, muss damit sachen absichern
- Man kann meistens von dem timerthread nicht direkt auf die Oberflaeche zugreifen (es darf nur 1 gui thread geben). unter windows weniger kritisch, da man die gui meist ueber fensternachrichten, und damit die msgpump bedient, welche sowieso entkoppelt (wenn man den richtigen befehl nimmt ^^) . aber unter QT z.b. kanns da scho aerger geben
Ciao ...
Stefan75
22-06-2006, 09:37
demgegenueber steht die impl mit eigenenem thread:
vorteil:
- genauer, da nur vom BS, nich von der eigenen anwendung abhaengig. (der scheduler vom BS ist fuer die threadsteuerung verantwortlich)
- man braucht kein fenster, geht also komplett ohne gui
Nachteile:
- sehr viel mehr aufwendiger
- man braucht mt, muss damit sachen absichern
- Man kann meistens von dem timerthread nicht direkt auf die Oberflaeche zugreifen (es darf nur 1 gui thread geben). ...
Ciao ...
hab dank, hoffe ich kann folgen...
diesbezüglich bin ich dann jetzt hier angelangt:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/multimed/htm/_win32_multimedia_timers.asp
der MMTimer hat einen eigenen Thread und ist soweit ich das verstanden habe auch im 5ms Bereich einsetzbar.
nur wie das ganze jetzt funzen soll...
hat wer schon mal mit so einem MMTimer gearbeitet?
bzw. gibt es da (für mich als Anfänger) noch nen anderen Weg?
(ich möchte mir da jetzt nicht unbedingt ein BS schreiben...zumal mein Praktikum in zwei Monaten endet...;) )
Hab mit dem ding noch nie gearbeitet, toent aber recht easy ^^
als erstes brauchst du min und max fuer die Zeiten die du einsetzen darfst.
Wichtig, deine Zeiten sind nicht absolut, sodern relativ zu ner resolution (welche selber global festlegen kannst)
die resolution bekommst mit timeGetDevCaps ...
mit timeSetEvent startest den timer
Abfangen tust den mit ner Callbackfunktion (schau nach funktionspointer usw.)
und stoppen mit DestroyTimer
Problem:
das ganze ist schoenstes C (iss ja auch die winapi)
der overhaed gegenueber ner eigenen loesung mittels nem thread iss nur minimal geringer, da hier auch auf threadsicherheit achten musst ...
Hier solltest einfach nehmen was dir besser liegt ^^ nur wie sollst das wissen wenn noch keine erfahrungen hasst ^^
Mit threads solltest dich trotzdem auseinandersetzen, weil du selbst bei der mm variante threadrelevante probleme bekommen wirst, und wenn das ned begreifst was da abgeht, dann wirst viel freude mit dem thema haben ^^
Und wenn man das wesen von MT begriffen hat, iss nen eigener timer sozusagen das "hello World" programm unter den multi-threaded programmen ^^
Ciao ...
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.