setIntervall löschen

intercorni

Erfahrenes Mitglied
Hallo Leute,

in meinem Hauptmovie habe ich einen Timer mittels setInterval aufgebaut:
PHP:
//timer
function daPause(wait, arg) {
        wait == undefined ? wait=10 : null;
        var p_count = 0;
        var p_int = setInterval(function () {
                if (p_count>=wait) {
                        arg();
                        clearInterval(p_int);
                }
                p_count++;
        }, 100);
}
Diesen übergebe ich eine bestimmte Funktion zum Aufrufen, z.B. hier
einfach verdeutlicht durch ein trace:
PHP:
function loop1() {
        trace("loop1");
} 
function loop2() {
        trace("loop2");
}
function loop3() {
        trace("loop3");
}
Den Timer inkl. Funktionsaufruf löse ich so aus:
PHP:
daPause(60, loop1);
Nun habe ich das Problem, dass ich alle gerade laufenden setInterval die oben definiert wurden, mittels eines einzigen Button-Clicks löschen muss und ich nicht genau weiß, wie man das genau lösen kann.
Hatte zuerst versucht, auf dem Button ein clearInterval(p_int) zu legen, was aber nicht funktionierte.
Nun habe ich den Hinweis bekommen, die intervallIDs in ein array zu pushen.
Allerdings kann ich damit nicht viel anfangen und benötige jetzt dringen einen Tip, wie ich vorgehen muss.

Danke,

Cornel.
 
Hi,

probiers mal so:
Code:
var intervals = new Array();

function daPause(wait, arg) {
    wait == undefined ? wait=10 : null;
    var p_count = 0;
    var p_int = setInterval(function () {
        if (p_count>=wait) {
            for (var i in intervals) {
                if (p_int == intervals[i]) {
                    intervals.splice(parseInt(i, 10), 1);
                    break;
                }
            }
            arg();
            clearInterval(p_int);
        }
        p_count++;
    }, 100);
    intervals.push(p_int);
}

function clearAll() {
    for (var i in intervals) {
        var f = parseInt(intervals[i], 10);
        clearInterval(f);
    }
    intervals = new Array();
}

daPause(10, f1);
daPause(20, f2);

function f1() {
    trace("f1");
    trace(intervals);
}

function f2() {
    trace("f2");
    trace(intervals);
}

button.onPress = function() {
    clearAll();
}
Wenn bei einem "clearAll" auch alle Rückruf-Funktionen sofort ausgeführt werden sollen, kannst Du dafür ein zweites Array anlegen, in dem die Funktionsreferenzen mit den selben Indizes abgelegt werden.

Gruß
.
 
Hallo,

das Problem ist, dass du den Identifier des Intervals mit var in einer Funktion instanzierst, weil nämlich alle Variablen, die innerhalb einer Funktion mit var deklariert werden, nach dem Abarbeiten der Funktion verworfen werden. Deshalb wirst du deinen Identifier so nie mehr finden.
2 Tipps:

1. Speicher den Identifier als Member-Variable auf deiner Zeitleiste, dann kannst du den auch vernünftig ansprechen und löschen:
Code:
this.p_int = setInterval(function () { 
//usw

meinButton.onRelease = function () {
     clearInterval(this._parent.p_int);
}

2. An deiner Stelle würd ich mir angewöhnen, einem Intervall eine Container-Instanz mitzugeben. Der Vorteil dabei ist, dass du den Loop aus der Funktion heraus löschen kannst, da du mit this in der Funktion nun nicht den Intervall, sondern eben genannte Instanz ansprichst. Das bedingt aber, dass du die auszuführende Funktion separat definieren musst:

Code:
function daPause(wait, arg) {
        wait == undefined ? wait=10 : null;
        var p_count = 0;
        var p_int = setInterval(this, "execute", 100, arg);
}  

function execute(fn) {
       if (p_count>=wait) {
            fn();
            clearInterval(p_int);
       }
       this.p_count++;
}


gruss

EDIT: Argh, ausgleichende Gerechtigkeit :-)
 
Danke für die Lösungsvorschläge,

ich habe das obige erste Beispiel ausprobiert, bekomme aber den Timer
nicht gestartet.
So löse bzw. versuche ich, setIntervall zu starten:

PHP:
if (info.name == "point10"){
			my_ns1.pause();//Video stoppen
			trace("point10");
			function f1() {
    			trace("f1");
    			trace(intervals);
				//my_ns1.seek(121);
				//my_ns1.pause(false);
				}
			
			f1();//function f1 aufrufen
		}

Mir wird zwar ein trace bei point10 ausgegeben, jedoch kein trace bei f1 bzw. intervals.
Was mache ich denn falsch?

Danke,

Cornel
 
Verstehe es nicht, hier nochmal mein Scripting.

Timer:
PHP:
var intervals = new Array();

function daPause(wait, arg) {
    wait == undefined ? wait=10 : null;
    var p_count = 0;
    var p_int = setInterval(function () {
        if (p_count>=wait) {
            for (var i in intervals) {
                if (p_int == intervals[i]) {
                    intervals.splice(parseInt(i, 10), 1);
                    break;
                }
            }
            arg();
            clearInterval(p_int);
        }
        p_count++;
    }, 100);
    intervals.push(p_int);
}

function clearAll() {
    for (var i in intervals) {
        var f = parseInt(intervals[i], 10);
        clearInterval(f);
    }
    intervals = new Array();
}

daPause(60, f1);
//
function f1() {
    trace("f1");
    trace(intervals);
}

Und das Auslösen des Intervalls:
PHP:
if (info.name == "point10"){
			my_video1.pause();
			trace("point10"););
			this.intervalId = setInterval (this, "f1", 100);
			}

Funktioniert so leider nicht :-(
Wie muss es denn richtig sein?

Danke,

Cornel
 
Hi,

die beiden Codeschnipsel haben doch nichts miteinander gemein: Wenn Du ein Intervall nicht über die Funktion "doPause" startest, wird auch nichts in "intervals" eingetragen und kann daher nicht abgefragt werden.

Was willst Du genau erreichen?

Gruß
.
 
Sorry wenn ich das durcheinander bringe, ist Neuland für mich und ich versuche es zu verstehen, was ja nicht so einfach ist.
Was ich erreiche möchte ist dies:
Ich lade nacheinander je nach Button-Aufruf ein Video (FLV) in mein Hauptmovie.
In den flv sind CuePoints gesetzt, die u.a. am Ende ein Loop erzeugen.
Diese Schleife soll aber von einem Timer gesteuert werden, sodass z.B. die
Schleife alle 6 Sekunden abgespielt wird.
Da aber jedes FLV eine andere Länge hat, muss es möglich sein, den Rücksprung zum Loopanfang mit in die Funktion zu integrieren.
z.B. so:
PHP:
function loop1() {
        trace("loop1");
		my_video.seek(121);//zurücksetzen des Videos an den Loopanfang
		my_video.pause(false);//starten des Videos

Den Cuepoint lese ich so aus, hier müsste dann auch der Timer gestartet werden:
PHP:
if (info.name == "point10"){
			my_video.pause();//stopp Video
			trace("point10");
			}
Allerings bin ich trotz obiger Hilfe noch nicht weitergekommen.
Würde mich sehr freuen, wenn mir nochmals genau geholfen werden kann.

Danke,

Cornel.
 
Hallo,

du möchtest also eine gewisse Zeit verstreichen lassen, bis ein weiterer Loop gestartet wird.

Ein Vorschlag:
Du könntest ein Intervall mit der loop1-Funktion starten, die Funktion unterbricht das Intervall jedoch nach dem ersten Aufruf bereits wieder. So könntest du quasi mit dem Intervall-Parameter der setInterval-Funktion die Länge der Pause zwischen zwei Loops steuern:

Code:
function loop1() {
        trace("loop1");
        my_video.seek(121);//zurücksetzen des Videos an den Loopanfang
        my_video.pause(false);//starten des Videos 
        clearInterval (this.intervalID);
}

if (info.name == "point10"){
        my_video.pause();//stopp Video
        this.intervalID = setInterval (this, "loop1", 6000);
        trace("point10");
}

gruss
 
Zurück