Timer-Verwaltung

Previous topic - Next topic

Quentin

also ehrlich, ich finds nicht gut, wenn hier Posts einfach gelöscht werden. Man kann etwas klarstellen oder auch korrigieren, aber einfach streichen stinkt nach willkürlicher Zensur, und dabei ist's mir erst mal wurscht, ob das aus Sicht der Mods gerechtfertigt scheint oder auch nicht.

aber zum Thema:
Ich finde die Idee von Schranzi mit der Timer-Funktion gar nicht so verkehrt, vor allem wenn man damit mehrere Timer verwalten könnte. Ich habs damit mal versucht, wobei man sogar ohne GLOBALs auskommen kann ;). Dazu müssten die Timer aber erst einmal initialisiert werden. Das geht, indem man als Zeitdauer (millisec) einen negativen Wert mitgibt. Die Timernummern sollten bei Null starten

Code (glbasic) Select

DeltaTimer(0, -1)
DeltaTimer(1, -1)
DeltaTimer(2, -1)

LOCAL counter1, counter2, counter3

WHILE TRUE
IF DeltaTimer(0, 100) THEN INC counter1, 1
IF DeltaTimer(1, 500) THEN INC counter2, 1
IF DeltaTimer(2, 1000) THEN INC counter3, 1
PRINT "1. Timer: " + counter1, 0, 0
PRINT "2. Timer: " + counter2, 0, 20
PRINT "3. Timer: " + counter3, 0, 40
SHOWSCREEN
WEND


// ------------------------------------------------------------- //
// ---  DeltaTimer  ---
// num: internal number of the timer
// millisec: duration ot timer interval
// millisec < 0 --> new timer is created
// ------------------------------------------------------------- //
FUNCTION DeltaTimer: num, millisec

STATIC timer[]

IF millisec <= 0
DIMPUSH timer[], num
timer[LEN(timer[])-1] = GETTIMERALL()
ELSE
IF num > LEN(timer[]) - 1 THEN RETURN FALSE
IF timer[num] < GETTIMERALL()
timer[num] = GETTIMERALL() + millisec
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE

ENDFUNCTION // DELTATIMER

Schranz0r

Danke Quentin!
Endlich mal einer, der selber schaut, das er was auf die Reihe bekommt.
Sehr lobenswert!

Hier ist auch wenigstens die Bezeichnung "DeltaTimer" gerechtfertig :)

Funktioniert super, und kommt ganz ohne Globals aus... sehr schön  :good:
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Quentin

Danke Schranz0r.
Trotzdem gilt meine Rüge noch, daß Löschen von Posts keine feine Art ist. Sonst läufst du Gefahr, zum BB-Mod zu mutieren ;) und das ist beileibe kein Fortschritt.

Schranz0r

irgendwo muss man Ordung halten ;)
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Quentin

#4
eine etwas andere Version, womit Timer noch einfacher zu handhaben sind, wie ich glaube.

- die Timer werden komplett innerhalb der Funktion DeltaTimer verwaltet und ist somit "gekapselt"
- Das Initialisieren vor der Hauptschleife entfällt.
- Auch kann die Nummerierung der Timer willkürlich sein

[EDIT]
wobei ich jedoch nicht weiß, ob es sinnvoll ist, wenn man Arrays innerhalb von Funktionen mit STATIC deklariert. Werden die dann im Stack abgelegt? Könnte das Speicherprobleme geben? Allerdings hab ich es mal spaßeshalber mit der Anlage von 10.000 Timern probiert. Lief problemlos.

Code (glbasic) Select

// --------------------------------- //
// Project: DeltaTimer
// Start: Monday, August 04, 2008
// IDE Version: 5.341

// some constants for different timers
LOCAL SHIP = 10
LOCAL ENEMY01 = 11
LOCAL ENEMY02 = 12

LOCAL counter1, counter2, counter3

WHILE TRUE
IF DeltaTimer(SHIP, 100) THEN INC counter1, 1
IF DeltaTimer(ENEMY01, 500) THEN INC counter2, 1
IF DeltaTimer(ENEMY02, 1000) THEN INC counter3, 1
PRINT "1. Timer: " + counter1, 0, 0
PRINT "2. Timer: " + counter2, 0, 20
PRINT "3. Timer: " + counter3, 0, 40
SHOWSCREEN
WEND


// ------------------------------------------------------------- //
// ---  DeltaTimer  ---
// num: internal number of the timer
// millisec: duration ot timer interval
// ------------------------------------------------------------- //
FUNCTION DeltaTimer: num, millisec

TYPE t_timer
number
interval
ENDTYPE
STATIC timer[] AS t_timer
LOCAL lt AS t_timer
       
// set new timer interval if necessary
FOREACH lt IN timer[]
IF lt.number = num
IF lt.interval < GETTIMERALL()
lt.interval = GETTIMERALL() + millisec
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDIF
NEXT

// this will only be executed if timer was not found yet
// so we create a new one
lt.number = num
lt.interval = GETTIMERALL() + millisec
DIMPUSH timer[], lt
RETURN FALSE

ENDFUNCTION // DELTATIMER