Timer programmieren

Hallo,

ich möchte in C++ in einem Abstand von einer bis zehn Millisekunden eine bestimmte Prozedur aufrufen. Ich komm aus der VB-Ecke und da würd ich einfach einen Timer einsetzen, der ein Ereignis auslöst. Wie macht man das in VC++?

Zur Zeit programmiere ich an einer Konsolenapplikation. Später soll daraus eine grafische Oberfläche werden, wahrscheinlich dann als MFC-Applikation.

Danke schon mal.

Gruss, Omar Abo-Namous

Hallo,

ich möchte in C++ in einem Abstand von einer bis zehn
Millisekunden eine bestimmte Prozedur aufrufen. Ich komm aus
der VB-Ecke und da würd ich einfach einen Timer einsetzen, der
ein Ereignis auslöst. Wie macht man das in VC++?

Diese zeitliche Auflösung wirst Du so ohne weiteres nicht hinbekommen. Erst recht nicht unter Windows. Wenn Du wirklich „jede Millisekunde“ einen bestimmten Task ausführen musst, dann solltest Du Dir über eine schnelle Umgebung mit einem Echtzeitbetriebssystem wie QNX oder dergleichen Gedanken machen.

Worum geht es denn? Vielleicht lässt sich das Problem ja auch ganz anders lösen :smile:

Gruß

Fritze

Diese zeitliche Auflösung wirst Du so ohne weiteres nicht
hinbekommen. Erst recht nicht unter Windows. Wenn Du wirklich
„jede Millisekunde“ einen bestimmten Task ausführen musst,
dann solltest Du Dir über eine schnelle Umgebung mit einem
Echtzeitbetriebssystem wie QNX oder dergleichen Gedanken
machen.

Worum geht es denn? Vielleicht lässt sich das Problem ja auch
ganz anders lösen :smile:

Es geht um eine digitale Regelung. Ich bin mir sicher, dass es unter windows klappt, da ich dieselbe Regelung mit VB und delphi schon vorgenommen habe. Nur in beiden kann man einfach ein activex-timer auf die Arbeitsfläche schieben und dieser hat sofort ein Ereignis, das ich programmieren kann. Bei c habe ich kein solches Element gefunden.

Nochmal: ich will keine 100%ige Sicherheit haben, dass das Ereignis ausgelöst wird. Und ich muss unter windows programmieren.

Gruss, Omar Abo-Namous

hallo, z.B mit…

UINT SetTimer(
HWND hWnd, // handle of window for timer messages
UINT nIDEvent, // timer identifier
UINT uElapse, // time-out value
TIMERPROC lpTimerFunc // address of timer procedure
);

gruß tobias

Hallo,

benutze ich das direkt irgendwo in main? Ich nehme an lpTimerFunc ist die Adresse der Prozedur, die im Falle eines Events aufgerufen wird? Wie bekomme ich denn die Adresse einer Prozedur raus? time-out-value sit wahrscheinlich in ms? und was ist ein timer iderntfier? Eine Zahl?

Es wäre nett, wenn du ein Beispiel angeben könntest.

Gruss, Omar Abo-Namous

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

Es geht um eine digitale Regelung. Ich bin mir sicher, dass es
unter windows klappt

Ich bin mir sicher, dass es niemals *zuverlässig* unter Windows klappen wird. Insbesondere nicht, wenn Du einen Timer-Interrupt im Millisekundenabstand bekommst und abarbeiten willst. Stichworte: Scheduler und Interrupt-Latency.

Nochmal: ich will keine 100%ige Sicherheit haben, dass das
Ereignis ausgelöst wird. Und ich muss unter windows
programmieren.

Wozu dann der Aufwand, wenn es ohnehin wurscht ist, ob die Routine arbeitet oder nicht, dann lass sie gleich ganz weg.

Gruß

Fritze

ok, hier mal ein beispiel, allerdings muß ich dazu sagen, daß das bei einer konsole-anwendung wohl so nicht funktioniert.

erstmal evtl. windows.h einbinden.

dann ne timer funktion definieren:

VOID CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime){ // do something !!!}

dann irgendwo den timer setzen:

::SetTimer(NULL, 666, 1000, TimerProc);

Hallo Fritze,

das war nicht sehr hilfreich!!

Was ich meinte ist einfach folgendes: mir ist es egal, ob das ereignis nach 10 msec oder nach 10.5 msec stattfindet. Die Regelung fand schon in VB und Delphi statt ohne auf ein RTOS umsteigen zu müssen. Ich will einfach nur einen timer.

Wenn du nicht helfen kannst/willst, dann brauchst du nicht antworten.

Gruss, Omar Abo-Namous

PS: tut mir leid, dass ich so „böse“ antworten musste.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

ich verwende ein MFC-Projekt! Mit graphischer Oberfläche, also keine Konsolenanwendung. nochmal die Frage: das VOID CALLBACK kommt vor main und dann kommt ::SetTimer in der main function??

Danke, Omar Abo-Namous

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

ich verwende ein MFC-Projekt! Mit graphischer Oberfläche, also
keine Konsolenanwendung. nochmal die Frage: das VOID CALLBACK
kommt vor main und dann kommt ::SetTimer in der main
function??

Danke, Omar Abo-Namous

das SetTimer() kannst du aufrufen wo du willst, nur muß dort bereits die callback funktion deklariert sein.

Omar, lies’ Dir doch vielleicht einfach die Dokumentation zu SetTimer durch, da ist beschrieben, was welcher Parameter macht und sogar ein Link zu einem Beispiel ist angegeben:
http://msdn.microsoft.com/library/default.asp?url=/l…

Kurz gefasst kann mit SetTimer ein Timer aufgezogen werden, der in bestimmten Intervallen feuert. Dabei kann entweder eine Windows Nachricht (WM_TIMER) an ein angegebenes Fenster geschickt werden oder eine Callback-Funktion aufgerufen werden.
Im zweiten Fall übergibt man die zu verwendende Funktion an SetTimer (indem man einfach den Funktionsnamen hinschreibt) und die wird dann jeweils aufgerufen.

Egal wie Du’s machst, vergiss’ nicht, den Timer per KillTimer wieder abzuschießen, wenn Du ihn nicht mehr benötigst (beliebter Anfängerfehler).

Gruß,
Martin

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Omar,

ich möchte in C++ in einem Abstand von einer bis zehn
Millisekunden eine bestimmte Prozedur aufrufen. Ich komm aus
der VB-Ecke und da würd ich einfach einen Timer einsetzen, der
ein Ereignis auslöst. Wie macht man das in VC++?

Weia.

bei C/C++ gilt das Motto der Compilerhersteller:
we provide the gun and the bullets, you provide the foot

Zur Zeit programmiere ich an einer Konsolenapplikation. Später
soll daraus eine grafische Oberfläche werden, wahrscheinlich
dann als MFC-Applikation.

Ich hab mir die Postings durchgelesen und denke, Du wirst das
mit den timer()-Funktionen schon hinbekommen, wenn Du einiger-
massen ein „Händchen“ für C/C++ bekommen hast.
Vielleicht kannst Du Dich ein wenig einlesen:
http://www.codeguru.com/Cpp/W-P/system/timers/

Eine Alternative wäre, durch einen zweiten timing-Thread
einen timer quasi selbst zu bauen, vgl.
http://www.codeguru.com/Cpp/W-P/system/timers/articl…
u.a.

CMБ

http://www.codeproject.com/system/timers_intro.asp
siehe auch:
http://www.codeproject.com/system/timers_intro.asp

CMБ

Danke
Danke an alle (Sternchen sind vergeben), aber ich werde glaube ich wieder mit vb programmieren.

Gruss, Omar Abo-Namous