TTimer - wie sauber resetten?

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

rambo256

Betreff: TTimer - wie sauber resetten?

BeitragDo, Jul 22, 2010 13:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
ich habe ja schon viel erlebt mit Referenzen, Pointer etc. . Studiere ja nicht umsonst Informatik...
Jedoch kann ich mir einige Fehler in BMax nocht nicht schlüssig erschließen:

Ich bekomme Probleme mit den Timern,
wie resette ich diese !sauber!, ohne eine NullPointer Exception.

Ich habe verschiedene Varianten probiert, die für mich einleuchtenste ist diese:

BlitzMax: [AUSKLAPPEN]
StopTimer(bspTimer)
bspTimer = New TTimer
bspTimer = TTimer.Create(1)


Oder man lässt die Zeile weg:
BlitzMax: [AUSKLAPPEN]
bspTimer = New TTimer


Wie handhabt ihr das?
Asus F53z

Das Leben ist eine reine Konkatenation...

Xeres

Moderator

BeitragDo, Jul 22, 2010 14:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Da ich Timer mit Frequenzen nutzlos finde, hab ich mir selbst welche Geschrieben.
Wozu möchtest du den Timer resetten (bzw. auf was)?
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

rambo256

BeitragDo, Jul 22, 2010 14:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, auf 0 Wink

Ich arbeitere gerade an einem "Workaround", d.h. ich vergleiche nun die Zeit vom letzten Event mit der aktuellen und handel dann, wenn eine bestimmte Zeitspanne erreicht wurde.
Jedoch habe ich selbst da anscheinend ein Speicherleck - von daher würde mich dann doch mal interessiere, wie ihr einen Timer sauber initialisiert.
Wenn das nichts hilft, dann muss ich wohl nach anderen Einflüssen nachsehen, die Speicherlecks verursachen :/
Asus F53z

Das Leben ist eine reine Konkatenation...

Xeres

Moderator

BeitragDo, Jul 22, 2010 14:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Nunja, man könnte...
BlitzMax: [AUSKLAPPEN]
SuperStrict

Graphics(128, 128)
Local Frametimer:TTimer = TTimer.Create(60)
Local timer:TTimer = TTimer.Create(1)
SetColor(255, 255, 255) ;SetClsColor(0, 0, 0)

Repeat
Cls

If timer.Ticks() = 1 Then
DrawText("TICK", 64, 64)
timer._ticks = 0 '* Auf Felder zugreifen auf die man nicht zugreifen sollte
EndIf

Frametimer.Wait()
Flip(0)
Until KeyHit(KEY_ESCAPE) Or AppTerminate()
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

mpmxyz

BeitragDo, Jul 22, 2010 14:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich nutze zwar nur immer einen einzigen Timer, aber wenn ich mir den Code des Modules anschaue, sollte dies hier funktionieren:
BlitzMax: [AUSKLAPPEN]
timer.Stop()
timer=CreateTimer(1)

Wenn es doch nicht funktioniert und du die neuste Version hast, solltest du vielleicht einen Fehlerbericht auf blitzbasic.com schreiben.
Dass man einen Timer manuell stoppen muss, ist aber auch nicht sehr schön...
Eventuell gibt es aber einen Grund, weshalb er beim Vernichten des Objektes nicht gestoppt wird.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

rambo256

BeitragDo, Jul 22, 2010 15:21
Antworten mit Zitat
Benutzer-Profile anzeigen
@Xeres:
Ah super, danke. Benutztu du eine andere API, als die Standard-Documentation die bei BMax dabei ist?

@mpmxyz:
Mhh okay, aber ich denke mal das Nebeneffekte meine Probleme verursachen. Alle anderen Timer laufen bislang problemlos. Wenn jemand eine Idee hat, welche Befehle oder ähnliches, den Timer beeinflussen - bis auf die in der API beschriebenen, nur raus damit Smile
Asus F53z

Das Leben ist eine reine Konkatenation...

Xeres

Moderator

BeitragDo, Jul 22, 2010 15:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich benutze die Standard Dokumentation, aber Blide schlägt auch alle Felder vor.

Variante die ich verwende:
BlitzMax: [AUSKLAPPEN]
SuperStrict

Graphics(128, 128)
Local Frametimer:TTimer = TTimer.Create(60)
Local timer:TNTimer = TNTimer.Create(1000)
SetColor(255, 255, 255) ;SetClsColor(0, 0, 0)
Global ms:Int

Repeat
Cls
ms = MilliSecs()

If timer.Check() Then
DrawText("TICK", 64, 64)
EndIf

Frametimer.Wait()
Flip(0)
Until KeyHit(KEY_ESCAPE) Or AppTerminate()

Type TNTimer
Field Zeit:Int, Dauer:Int

Method Check:Int()
If Self.Zeit + Self.Dauer < ms Then
Self.Reset()
Return True
Else
Return False
End If
End Method

Method Reset()
Self.Zeit = ms
End Method

Function Create:TNTimer(_dauer:Int, _StartType:Int = False)
Local t:TNTimer = New TNTimer
'** Timer ausgelaufen starten (beim ersten Check 'schlägt' er)
If _StartType = True Then
t.Zeit = ms
Else
t.Zeit = 0
EndIf
t.Dauer = _dauer
Return t
End Function

End Type
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

rambo256

BeitragDo, Jul 22, 2010 20:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Netter Code Wink

Ich bin weiter auf Ursachenforschung gegangen.
Wann löscht der GarbageCollector eigtl Objekte? In regelmäßigen Zeitabständen? oder am Ende einer Funktion?
Noch etwas, es scheint so, als ob bei mir irgendwann der TTimer generell nicht mehr richtig funktioniert.
Ich habe die Null-Pointer Exception aufgefangen und ihn so behandelt:

BlitzMax: [AUSKLAPPEN]
Catch e$
Print "Caught Exception: "+e
Self.gunTimer = New TTimer
Self.gunTimer = TTimer.Create(reloadTime)
If Self.gunTimer = Null Print "GunTimer konnte nicht erstellt werden."
Self.oldReloadTicks = 0
End Try


Eigtl, sollte dieser gunTimer ja nun wieder auf ein gültiges Objekt verweisen....
Jedoch tut es dies nicht.
Gibt es eine Besonderheit in BMax, die ich in diesem Zusammenhang kennen sollte? Smile
Asus F53z

Das Leben ist eine reine Konkatenation...

mpmxyz

BeitragDo, Jul 22, 2010 21:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Hast du dir den Ort der NullPointer-Exception angesehen?
Ich denke, dass sie im Timer-Modul stattfindet. (Dort wird nämlich in C-Codes mit Objektreferenzen etwas herumhantiert.)
Du scheinst im Moment einfach davon auszugehen, dass die Timer-Variable "Null" ist. Hast du das auch getestet?
mfG
mpmxyz
P.S.: Der GC kann (fast) immer löschen.
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

rambo256

BeitragDo, Jul 22, 2010 23:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Natürlich habe ich mir die Stellen angesehen.
Sonst hätte ich ja nicht die Exceptions lokalisieren können. Dafür ja Try-Catch.
Die If-Anweisung ist dafür da, um direkt nach dem eigtl Konstruktor Aufruf zu überprüfen, ob denn nun meine Referenz gunTimer auf ein gültiges Objekt verweist.
Mich macht es stuzig, dass selbst nach einem direkten Konstruktor-Aufruf meine Referenz gunTimer auf "nichts" verweist...

Wegen dem GarbageCollector, spielst du auf die Befehle des GCs an, ihn zu stoppen?
Asus F53z

Das Leben ist eine reine Konkatenation...
 

jsp

BeitragFr, Jul 23, 2010 8:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Mich macht es stuzig, dass selbst nach einem direkten Konstruktor-Aufruf meine Referenz gunTimer auf "nichts" verweist...

Verwendest du in dem Moment evtl. mehr als 16 Timer in deinem Programm?
Logic Gui Professional a Gui Designer for MaxGui

rambo256

BeitragFr, Jul 23, 2010 12:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist nen sehr sehr guter Einwand.
Jeder Gegner hat einen eigenen Timer und der Fehler tritt erst nach einer gewissen Zeit auf
-> Ich habe mal mitzählen lassen und es kam dabei heraus, dass ab einer insgesamten Timer Anzahl von 10 der Fehler auftritt. Klasse!
Vor allem, es sind nie gleichzeitig so viele aktiv, entweder der Garbage Collector baut Mist - heißt er vernichtet den "Müll" nicht sauber, oder es ist eine höhere "Macht" Wink

Falls keine Ideen mehr aufkommen, wie man das Problem beheben kann, werde ich mich dann mal darum kümmern müssen, mir einen Ersatz-Timer zu programmieren. So etwas wie Xeres schon bereits gepostet hat Smile

EDIT:
Habe mich nun dazu entschlossen, einen globalen Timer für alle Events zu nutzen. Dies habe ich nun umgesetzt und bin mit dem Ergebis sehr zufrieden. Somit kann ich endlich einen neuen Worklog-Eintrag schreiben und die Zeit bis zu einer kleinen Demo ist nicht mehr allzu weit Wink
Asus F53z

Das Leben ist eine reine Konkatenation...

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group