Welche Funktion für Countdown

paddymann

Mitglied
Hi!
Ich möchte einen Countdown ablaufen lassen, bei dem der Benutzer sieht wie viele Sekunden es noch bis 0 sind. Ich weiss jezt aber nicht was ich dafür nehmen soll. Es gibt ja z.B. clock() aber da weiss ich nicht wie ich damit rückwärts zählen soll. "Sleep" fält ja sowieso weg. Dann fällt mir ncoh Timer ein aber wie muss cih das mit der Funktion machen
Danke für eure Antworten.
 
moin


Einfach abfragen wie lange, Schleife starten mit maximal soviel Durchläufen wie Sekunden, immer mit Sleep eine Sekunde warten.

Aber warum meinst du Sleep fällt weg?
Und wie genau muss das ganze sein?


mfg
umbrasaxum
 
Hallo,

Timers sind wirklich nicht schwer. Du erstellst eine Timer Funktion (glaube es war ne DWORD Funktion). Die muss bestimmte Übergabeparameter haben.
Dann erstellst du den Timer übergibst dabei die Funktion und sagst, dass die Timer-Funktion jede Sekunde aufgerufen werden soll.

Wie man Timer benutzt wird in der MSDN erklärt
 
Es gibt einige moeglichkeiten, von einfach bis kompliziert, haengt davon ab was du brauchst ....

Timer (WM_TIMER nachricht unter windows) nimmt man vor allem, wenn es nicht aufs blockieren drauf an kommt . da spart man sich nen thread fuer das timing aufzuziehen ...

Nachteil iss natuerlich, da der timer da eigentlich der selbe thread wie dein FensterMsgPump Thread ist, das wenn du in irgend einer funktion was laengeres lauft, was zeitlich ueber dein timer intervall hinausgeht, das deine timer events versetzt werden .

Brauchst du die zeit da einigermassen genau ... darfst dich halt nich auf die laufzeit des timers verlassen sondern musst die zeiten expliziet bestimmen.

Dazu liest man am besten das RTC register des prozessers aus ... unter windows (win32-api) gibts da praktische funktionen fuer die dir viel arbeit ersparen ...
QueryPerformanceCounter liefert dir die ticks die seit rechnerstart vergangen sind (ticks sind takte des FSB Qurzes auf dem MB) ... und QueryPerformanceFrequency sagt dir die wieviel Ticks eine sekunde sind ....
Iss nich soo genau, fuer deine anwednung langts aber 1000 mal.
Vorteile dieser funktionen sind, das sie schnell gehen und nich auf externe geraete / trieber zugreifen ...

Wenn du willst, dass eine langwierige operation (beispielsweisse nen parsen eines GB grossen files, etc ... ) deinen counter nicht blockiert, wirst um multithreading / Multiprozessing nicht herumkommen ....

Ciao ...
 
Erstmal Danke für eure Antworten. ICh dachte Sleep würde wegfallen, da dabei ja immer das ganze Programm angehalten wird. (Bin nicht auf die Möglichkeit von dir gekommen umbrasaxum :-( ).
Wo muss ich denn in der MSDN nach "Timer" suchen In der Library?
Brauche den Timer überigens für ne Konsolen-Anwendung nicht für WinAPI.
 
moin


Ja, bei Sleep hällt das ganze Programm an, was bei einem "kleinen" Counter aber eher vorteilhaft ist.

Wenn du wirklich nen Timer erstellen willst, kannst du entweder nach Timer, oder gleich nach CreateTimer in der MSDN suchen.


mfg
umbrasaxum
 
Ja, bei Sleep hällt das ganze Programm an
Knapp daneben iss aber auch vorbei :-)

Sleep haelt nur den thread an ....
da die meisten Programme nur einen thread haben, gilt das eben nur meistens :-)

Brauche den Timer überigens für ne Konsolen-Anwendung nicht für WinAPI.
Das macht die sache leider schwieriger ....
Konsole hat keine msgpump, von daher kann sie dir keinen timer liefern ...
du musst den timer also selber bauen ....

entweder du implementierst sowas wie ne Eventschleife, ala Windows ... wo du zentral bei bedarf deinen Timer feuern kannst

oder du scheust den aufwand von Multithreading nicht ... und machst nen genauen timerthread auf ...
Dazu schaust dir am besten Events (CreateEvent, RaiseEvent,SetEvent), Threadprocs(CreateThread) und Waitfunctionen (WaitforsingleObject WaitForMultiObject) an ... alles Win32 API ...

Ciao ...
 
RHBaum hat gesagt.:
1.
Sleep haelt nur den thread an ....
da die meisten Programme nur einen thread haben, gilt das eben nur meistens :-)

2 .
Das macht die sache leider schwieriger ....
Konsole hat keine msgpump, von daher kann sie dir keinen timer liefern ...
du musst den timer also selber bauen ....

1. das dürfte ihm auch klar sein

2. Timer sind sehr wohl Möglich, auch in einer Konsole und da muss nichts selbst implementiert werden (vor allem nicht mit Multithreading)

timeSetEvent reicht vollkommen aus (weitere Infos wie immer in der MSDN)
 
Zurück