Author Topic: Timer-Verwaltung  (Read 7611 times)

Offline Quentin

  • Prof. Inline
  • *****
  • Posts: 915
    • View Profile
Timer-Verwaltung
« on: 2008-Aug-02 »
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
« Last Edit: 2008-Aug-04 by Quentin »

Offline Schranz0r

  • Premium User :)
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 5057
  • O Rly?
    • View Profile
Re: Timer-Verwaltung
« Reply #1 on: 2008-Aug-02 »
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 1700 @3.9GHz, 16GB HyperX Fury 3000MHz Ram, ASUS ROG GTX 1060 STRIX 6GB, Windows 10 Pro 64Bit, MSi Tomahawk B350 Mainboard

Offline Quentin

  • Prof. Inline
  • *****
  • Posts: 915
    • View Profile
Re: Timer-Verwaltung
« Reply #2 on: 2008-Aug-02 »
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.

Offline Schranz0r

  • Premium User :)
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 5057
  • O Rly?
    • View Profile
Re: Timer-Verwaltung
« Reply #3 on: 2008-Aug-02 »
irgendwo muss man Ordung halten ;)
I <3 DGArray's :D

PC:
AMD Ryzen 7 1700 @3.9GHz, 16GB HyperX Fury 3000MHz Ram, ASUS ROG GTX 1060 STRIX 6GB, Windows 10 Pro 64Bit, MSi Tomahawk B350 Mainboard

Offline Quentin

  • Prof. Inline
  • *****
  • Posts: 915
    • View Profile
Re: Timer-Verwaltung
« Reply #4 on: 2008-Aug-04 »
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
« Last Edit: 2008-Aug-04 by Quentin »