Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 19-10-2011, 23:58   #1 (permalink)
Neuer User
 
Registriert seit: Oct 2011
Beiträge: 14
Fragen zur Flash-Klasse Timer

Hallo,

ich habe wie oben beschrieben ein paar Fragen zur Flash-Klasse Timer:

1. Wenn ich ein Objekt der Timer-Klasse in einer Funktion lokal instanziere, kann ich dann davon ausgehen, dass das Objekt dann auch automatisch wieder "zerstört" wird, wenn die Anzahl der "Durchläufe" begrenzt und alle Durchläufe beendet wurden?
Normalerweise bleibt von lokalen Variablen in einer Methode nichts mehr übrig, wenn die Methode ausgeführt wurde und werden aus dem Speicher entfernt. Aber das Timer-Objekt zählt ja nach einem Methoden-Aufruf munter weiter... wie bei lokal erzeugten onEnterFrame-Ereignissen, von denen man eine Referenz behalten sollte, wenn man sie einmal wieder zerstören will.

Code-Schnipsel Beispiel
Code:
// erzeuge Timer der 4mal die "sayHelloWorld-Funktion" aufruft im Intervall von 1 Sekunde
var myTimerTestObject:TimerTestClass = new TimerTestClass();
myTimerObject.getTemporaryTimer(4);

...

public function getTemporaryTimer(counter:int):void {
	var timer:Timer = new Timer(1000, counter);
	timer.addEventListener(TimerEvent.TIMER, sayHelloWorld);

}

private function sayHelloWorld():void {
	trace("Hello World!");
}
2. Was passiert, wenn ich eine Variable überschreibe in der eine Referenz zu einem Timer-Objekt gespeichert ist, in dem ich ein neues Timer-Objekt instanziere? Wird der alte Timer dann beendet, oder das alte Timer-Objekt zerstört? Und werden alle mit ihm verbundenen EventListener auch automatisch mit aus dem Speicher entfernt? Oder verliere ich nur die Refernz zu einem Objekt, dass anschließend noch im Speicher liegt...

Code-Schnipsel Beispiel
Code:
// erzeuge Timer der 4mal die "sayHelloWorld-Funktion" aufruft im Abstand 1 Sekunde
var myTimer:Timer = new Timer(1000, 6);
myTimer.addEventListener(TimerEvent.TIMER, sayHelloWorld);

// überschreiben
overwriteTimerNow();

...

function overwriteTimerNow():void {
	myTimer = new Timer(500, 7);
	myTimer.addEventListener(TimerEvent.TIMER, sayHelloWorld);
}

function sayHelloWorld():void {
	trace("Hello World!");
}

Geändert von nexu (20-10-2011 um 00:04 Uhr)
nexu ist offline   Mit Zitat antworten
Alt 20-10-2011, 07:32   #2 (permalink)
brand new user
 
Benutzerbild von RustyCake
 
Registriert seit: May 2002
Ort: Laimbach 6 1/2
Beiträge: 16.884
Mach mal das:
PHP-Code:
var myTimer:Timer = new Timer(10006);
myTimer.addEventListener(TimerEvent.TIMERsayHelloWorld);
myTimer.start();
// überschreiben
overwriteTimerNow();



function 
overwriteTimerNow():void {
    
    
myTimer = new Timer(5007);
    
myTimer.addEventListener(TimerEvent.TIMERsayHelloWorld);
    
myTimer.start();
}

function 
sayHelloWorld(e:TimerEvent):void {
    
trace("Hello World!"+e.currentTarget.delay);

Dann das:
PHP-Code:
var myTimer:Timer = new Timer(10006);
myTimer.addEventListener(TimerEvent.TIMERsayHelloWorld);
myTimer.start();
// überschreiben
overwriteTimerNow();



function 
overwriteTimerNow():void {
    
myTimer.stop();
    
myTimer.removeEventListener(TimerEvent.TIMERsayHelloWorld);
    
myTimer null;
    
myTimer = new Timer(5007);
    
myTimer.addEventListener(TimerEvent.TIMERsayHelloWorld);
    
myTimer.addEventListener(TimerEvent.TIMER_COMPLETEsayServusWorld);
    
myTimer.start();
}

function 
sayHelloWorld(e:TimerEvent):void {
    
trace("Hello World!"+e.currentTarget.delay);
}
function 
sayServusWorld(e:TimerEvent):void {
    
trace("Servus World!"+e.currentTarget.delay);
    
myTimer.removeEventListener(TimerEvent.TIMERsayHelloWorld);
    
myTimer null;

Dann wäre glaube ich alles zerstört
__________________
Bitte keine Fragen, zu Flash per PM. Dazu ist das Forum da. Danke MFG_RustyCake!
"Wer tanzen will, muß erst gehen lernen"
RustyCake ist offline   Mit Zitat antworten
Alt 21-10-2011, 01:18   #3 (permalink)
Neuer User
 
Registriert seit: Oct 2011
Beiträge: 14
Okay ich werde das nochmal in einem neuen Test versuchen, so wie du das erklärt hast. Ich hoffe ich kann sicher stellen, dass nichts im Speicher bleibt. Könnte mir vorstellen, dass auch sowas die Performance nach längerem negativ beeinflusst, wenn im Speicher haufen Objekte liegen, die keine weitere Bedeutung für das Flashprojekt mehr haben und über keine Referenz mehr "ansprechbar" sind.

Edit:

Also das obere funktioniert schon mal nicht. Wenn ich die Variable mit einem neuen Timer-Objekt überschreibe muss ich vorher das alte Objekt zerstören, sonst hat man am Ende zwei Timer-Objekte, bei denen die Referenz erst erzeugten Objekt verloren gegangen ist... Und genau da ensteht das Problem...
Wie kann ich ohne großen Aufwand feststellen, dass der Timer zu Ende ist und das Objekt dann zerstören?

Geändert von nexu (21-10-2011 um 01:39 Uhr)
nexu ist offline   Mit Zitat antworten
Alt 21-10-2011, 02:05   #4 (permalink)
Keine Panik
 
Registriert seit: Apr 2010
Ort: Düsseldorf (im ernst)
Beiträge: 1.867
dürfte ich dir die Eigenschaften delay und repeatCount der Timer-Klasse ans Herz legen; dann brauchst du hierfür nicht extra neue Timer-Objekte erzeugen.
Und das ganze wird noch durch die Methoden stop() und reset() abgerundet.

Zitat:
Normalerweise bleibt von lokalen Variablen in einer Methode nichts mehr übrig, wenn die Methode ausgeführt wurde und werden aus dem Speicher entfernt.
such doch bitte mal nach "Closures"

Zitat:
2. Was passiert, wenn ich eine Variable überschreibe in der eine Referenz zu einem Timer-Objekt gespeichert ist, in dem ich ein neues Timer-Objekt instanziere? Wird der alte Timer dann beendet, oder das alte Timer-Objekt zerstört?
PHP-Code:
for(var i:int 0i<numChildren; ++i){
    var 
child:MovieClip getChildAt(i) as MovieClip;
    
trace(ichild);

werden hier die MovieClips gestoppt und von der Bühne entfernt? weil ich überschreib ja auch dauernd die Variable child mit dem jeweils nächsten Element

Zitat:
Und werden alle mit ihm verbundenen EventListener auch automatisch mit aus dem Speicher entfernt?
nein. es gibt zwar den Parameter useWeakReference, der genau das erledigen sollte, nur seh ich hier im Forum kaum jemanden der das nutzt.
Ich für meinen teil räum lieber selbst hinter mir auf, dann weiss ich 1. dass es gemacht wird und 2. wann es gemacht wird.

Zitat:
lokal erzeugten onEnterFrame-Ereignissen, von denen man eine Referenz behalten sollte, wenn man sie einmal wieder zerstören will.
bitte keine unbenannten Funktionen als Event-Listener verwenden (wenn es dass ist, wass du da meinst), mit sowas handelst du dir nur ärger ein.
__________________
greetz Thomas

plz RTFM & Coding Conventions

Geändert von thomas_E (21-10-2011 um 03:36 Uhr)
thomas_E ist gerade online   Mit Zitat antworten
Alt 26-10-2011, 15:36   #5 (permalink)
Neuer User
 
Registriert seit: Oct 2011
Beiträge: 14
Okay, jetzt habe ich mehr Klarheit gewonnen.
Und wenn die Start-Funktion des Timers als Closure konserviert wird, dann wird sie auch weiter existieren...
Zitat:
dürfte ich dir die Eigenschaften delay und repeatCount der Timer-Klasse ans Herz legen; dann brauchst du hierfür nicht extra neue Timer-Objekte erzeugen.
Und das ganze wird noch durch die Methoden stop() und reset() abgerundet.
Stimmt, ich werde erstmal versuchen mein bisheriges Konzept selbst umzustellen, und hoffe, dass es reibungslos funktioniert. Sonst melde ich noch mal.
nexu ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Speed Hack sichere Timer Klasse Elo ActionScript 3 0 30-09-2010 13:32
Problem mit Timer Klasse bratzz ActionScript 3 4 27-08-2010 14:29
[STUFF] Timer Klasse public Stuff 4 11-08-2007 22:30
Fragen zu Timer und ENTER_FRAME Event brookman ActionScript 3 3 16-05-2007 13:22
Timer Klasse plus Wecker/Alarm Hans meisa ActionScript 2 1 04-05-2007 21:11


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:08 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele