mehrere setInterval mit clearInterval löschen

Lloyd

Erfahrenes Mitglied
hi,

Wie kann ich mehrere Intervalle, die in einer Variablen referenziert sind über clearInterval löschen?
ein Button hat bei mit flogendes Skript:
PHP:
on(release) {
	function call_ankuend () {
		clearInterval(IV);
		trace("called"); 
		trace(IV);
		}
	
IV = setInterval(call_ankuend,1000);
}
Nun läuft das korrekt, wenn ich einmal den Button klicke. Wenn ich ihn schnell zweimal klicke, bekommt IV den Wert 3. Nun scheint es, dass das Interval nicht mehr gelöscht werden kann. Es läuft immer weiter. Wie funktioniert diese Referenzstruktur? Wenn ich es nicht verstehe, dann kann ich es auch nicht beheben. Alles was ich weiss ist, da gibt es eine Variable IV die hat den Wert 3 (Rückgabe von setInterval). Aber wie soll ein Integer auf eine setInterval-Funktion referenzieren? Vielleicht kann mir das jemand näher bringen.
Eigentlich dürfte das ein häufiges Problem sein. Aber im Forum gibts dazu noch nix.
Danke.

PS: Habe Flash MX.
 
Hi,

nimm für jedes Interval eine neue Variable (z.B. ein Array) bzw. teste (wenn Du nur ein Interval brauchst), ob das Interval gesetzt ist, bevor Du ein neues definierst:
PHP:
 on(release) {
    function call_ankuend () {
        clearInterval(IV);
        IV = 0;
        trace("called");
        trace(IV);
        }
    if (IV == 0) {
        IV = setInterval(call_ankuend,1000);
    }
}
ausserdem weiss ich grad nicht, ob es Sinn macht, die Funktion in dem onRelease-Handler zu definieren, aber wenn es läuft... ? ;)

Gruß
.
 
ok. Deine Lösung funktioniert. Das ganze soll nur verhindern, dass das skript auch funktioniert, wenn ein Benutzer innerhalb der Sekunde mehrmals klickt.
Ob IV==null ist muss man noch abfragen, da am Anfang IV undefined ist. Hier der Code. Die trace Befehle sind nur zum Prüfen.
PHP:
on(release) {
	function call_ankuend () {
		trace("IV vor clear:"+IV);
		clearInterval(IV);
		trace("IV nach clear:"+IV);
		IV=0;
		trace("weitere anweisungen"); 
		trace("IV nach 0 setzen:"+IV);
		}
if (IV==0 || IV== null) {
	IV = setInterval(call_ankuend,1000); }
}
Was mit allerdings noch unklar ist: Ich klicke mehrmals (ob nun innerhalb oder ausserhalb des Sekundenrahmens ist egal, wegen dem Test) und IV wird weiterhin höhergezählt ("IV vor clear" und "IV nach clear"). Das heisst weder clearInterval setzt IV permanent wieder auf 0 noch IV=0; Das finde ich komisch.
Am besten wäre es wenn du mir die Hintergründe und die Funktionsweise dieser Referenzierung erklären kannst. Also wie läuft der ganze Spass, IV=setInterval und clearInterval(IV) intern ab. Dann könnte ich solche Probleme in Zukunft allein lösen, da ich eine generelle Vorstellung habe und müsste nicht wegen jedem konkreten Problem ins Forum rennen. -> Weniger Schreibarbeit für die Antwortenden.
Danke.
 
Hi,

die Funktion "call_ankuend" wird ja auch nicht direkt beim Klick auf den Button aufgerufen, sondern erst mit einer Sekunde verzögert durch das Intervall...

Ausserdem ist "null" nicht gleich "undefined" (was es auch erst ab Flash 7 gibt). Ich dachte eher an die profane Methode: Die Variable IV beim Filmstart einfach auf 0 setzen. ;)

Den Ablauf Deiner Konstruktion will ich nicht wagen, nachzuvollziehen (zumindest nicht, ohne ihn getestet zu haben), da ich das Verschachteln dieser Funktionen für eine recht aparte Vorgehensweise halte. Ich würde das einfach so lösen:
PHP:
// Diese Funktion nicht auf der Instanz, sondern direkt im MovieClip:
var IV = 0;

function call_ankuend() {
    clearInterval(IV);
    IV = 0;
}

// Und folgendes wie gehabt auf der Instanz:
on (release) {
    if (this.IV == 0) {
        this.IV = setInterval(function() { call_ankuend(); }, 1000);
    }
}

Gruß

P.S.: oder noch einfacher: Lösche das Interval einfach, bevor Du ein neues erstellst:
PHP:
on (release) {
    if (this.IV != undefined) clearInterval(this.IV);
    this.IV = setInterval(function() { call_ankuend(); }, 1000);

}
 
Das verschachteln der function im Button ist überhaupt kein Problem, war mir klar das die erst durch das setInterval aufgerufen wird. Egal, war nur zu Testzwecken.
null!=undefined -> wieder was gelernt.
Alle drei Versionen von dir funktionieren gut, wobei diese wohl die schönste ist (auch für andere die das lesen):
PHP:
//auf der Zeitleiste:
function call_ankuend() { 
	clearInterval(IV); 
    	trace("Weitere Anweisungen");
}
//auf dem Button:
on (release) { 
    	if (this.IV != undefined) clearInterval(this.IV); 
         this.IV = setInterval(function() { call_ankuend(); }, 1000); 
}

Was mich aber einfach nicht loslässt ist dass sich der Wert von IV beim klicken immer weiter erhöht, selbst wenn man IV=0; setzt. Ich versteh es nicht.
Der Code dazu:
PHP:
//auf der Zeitleiste:
function call_ankuend() { 
	trace("IV vorher:"+IV);
	clearInterval(IV); 
	IV=0;
	trace("IV nachher:"+IV);
	trace("Weitere Anweisungen");
}
//auf dem Button:
on (release) { 
   	if (this.IV != undefined) clearInterval(this.IV); 
         this.IV = setInterval(function() { call_ankuend(); }, 1000); 
}
Bitte kopier das mal auf die Stage und klick nen Button paarmal durch.
Das is doch blöd, wenn man was gleich 0 setzt und später ist es "auf einmal" wieder nicht mehr 0.
Das hängt ja irgendwie mit IV=setInterval zusammen. Der Wert von IV muss noch irgendwo anders gespeichert werden, aber wo?
Kannst du, oder jemand anderes, mir eine generelle Erklärung für dieses Referenzierungsmodell (siehe vorherige Posts) geben? Oder nicht. Aber bitte antworte auch wenn nicht. Dann lass ich es da weiter nachzubohren.
 
Hi,

nach allem was ich weiss, ordnet Flash den erstellten Intervallen Handles zu, die mit Integerwerten operieren. Mit dem IV-Wert 3 wird also das Interval mit der Handlenummer 3 angesprochen... darauf kannst Du m.E. keinen Einfluss nehmen, aber wozu auch?

Gruß
.
 
Gut. Da bin ich mit meiner Vorstellung darüber etwas weiter. Danke. Aber noch nicht ganz kappiert ;)
So wie ich mir das Vorstelle werden die Intervalle intern mit einer art Stack angesprochen, allerdings kann man auf diesen nur ein neues Intervall drauflegen, nicht runternehmen.
Ob es dafür ne Anwendung gibt, wenn man ne Vorstellung dafür besitzt, ist mir erstmal egal.
Ok wenn ich krampfhaft überlege...Interferenzen mit Linien-intervallen simulieren.
Also was bisher möglich ist: z.B. 4 Intervalle gleichzeitig überlagernd laufen lassen.
Und dann hat man 4 Buttons. Auf einem liegt das skript clearInterval(1), auf dem nächsten clearInterval(2) bis 4. Nun könnte man erst Intervall 3, dann Intervall 4, dann 2 löschen oder ähnlich.
Hätte man die Möglichkeit Bezeichner für das Interval selbst zu vergeben und könnte man von dem Stack auch echt was runternehmen, also löschen, wäre der Umfang der Funktionalität noch grösser. Zum Beispiel könnte man einfacher mehrere Intervalle mit nur 2 Buttons steuern, einen fürs hinzufügen eines Intervalls einen fürs löschen.
Ausserdem könnte man Abfragen welche Intervalle noch vorhanden sind.
Ok mit viel ScriptAufwand ist auch das zur Zeit möglich, aber umständlich.
Ich hoffe ich bin nicht völlig abgespaced ;)
 
Hi,

ich glaube, Du machst es Dir zu umständlich: speicher Deine Intervalle einfach in einem Array:
PHP:
count ++;
IV[count] = setInterval(blabla ...);
... dann kannst Du damit machen, was Du willst, ohne Dich um die interne Behandlung kümmern zu müssen.

Gruß
.
 
...und wenn du erstmal mitbekommst was für eine Shice Intervalle in mehrfach verschachtelten Containerkonstrukten mit öfterem Wechsel der die intervalle aufrufenden MC#s anrichten, wird dich deine Neugier schlagartig verlassen.
Für alle zum mitschreiben: Intervalle immer auf _root initialisieren, niemals in einem vom Überschrieb gefährdeten MC oder gar einem zur Laufzeit erstellten Objekt.
Nur so am Rande und eigentlich Off Topic, aber wichtig weil nervig.

B
 
Auch :offtopic: , aber warum hat Macromedia AS 2.0 nicht ne simple setTimeout-Funktion spendiert? In vielen Fällen brauche ich ein Intervall, das nur einmal aufgerufen wird (oder selbst für erneuten Aufruf sorgt) - und das würde vieles vereinfachen. :rolleyes:

Gruß
.
 
Zurück