Zurück   Flashforum > Flash > ActionScript > Softwarearchitektur und Entwurfsmuster

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 26-01-2006, 13:36   #1 (permalink)
Neuer User
 
Registriert seit: Jan 2006
Beiträge: 26
Actionscript blockiert Applikation

Hallo Leute

Ich habe ein Actionscript Script welches einige Berechnungen durchführt. Wenn diese Berechnung aber zu lange dauert, kommt beim Ausführen eine Meldung, dass das Script schon zu lange laufe - mit zwei Optionen "Skript Abbrechen" und "Weiterlaufen lassen" (sinngemäss).

Wie kann ich verhindern, dass dies passiert? Gibt es eine Art ProcessMessages wie in einigen anderen Programmiersprachen? Kann man dem Script eine "Verschaufspause" geben?

Danke schon mal!
flashfor ist offline   Mit Zitat antworten
Alt 26-01-2006, 13:41   #2 (permalink)
Achim Math.PI
 
Benutzerbild von bloba
 
Registriert seit: Jul 2001
Ort: cool Colonia
Beiträge: 11.637
dann hast du sicher eine nicht geschlossene wihle oder for schleife oder sonstige operationen die ins leere laufen...
__________________
gruß bloba

2 x onkel² b_d
bloba ist offline   Mit Zitat antworten
Alt 26-01-2006, 13:52   #3 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg
Beiträge: 4.385
du kannst die Berechnung in mehrere Teile zerlegen, und diese dann mit onEnterFrame oder setInterval abarbeiten.
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)
Janoscharlipp ist offline   Mit Zitat antworten
Alt 26-01-2006, 15:05   #4 (permalink)
Neuer User
 
Registriert seit: Jan 2006
Beiträge: 26
Das sind aber ziemliche Hacks und lässt sich schlecht in mein Programm einbauen. Gibt's keine elegantere Möglichkeit?
flashfor ist offline   Mit Zitat antworten
Alt 26-01-2006, 17:55   #5 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 18.052
nein, weil flash nicht für sowas gemacht ist. bei flash hat die animation "vorfahrt" (auch wenn sich optisch nichts bewegt). die kann/darf nicht mal eine minute unterbrechen um 42 zu berechnen ;-)
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de
hgseib ist offline   Mit Zitat antworten
Alt 26-01-2006, 20:50   #6 (permalink)
Neuer User
 
Registriert seit: Mar 2002
Beiträge: 44
Zitat:
Zitat von Janoscharlipp
du kannst die Berechnung in mehrere Teile zerlegen, und diese dann mit onEnterFrame oder setInterval abarbeiten.
diese Frage hatte ich auch schon mal gestellt und eine ähnliche Antwort bekommen -aber wie soll das mit setInterval funktionieren ?
so funktioniert es jedenfalls nicht !!
*********
var intervalID:Number;
var duration:Number = 100;
intervalID = setInterval(this, "ProcessbarCallBack", duration);
while (i<nRowsInDataArraySet) {
var AgtJobAdressItems_Array:Array = AgtJobAdress_Array[i].split("|");
agtjobadress_ds.addItem({AdressID:AgtJobAdressItem s_Array[0], AdressTyp:AgtJobAdressItems_Array[1], Status:AgtJobAdressItems_Array[2], Lastdate:AgtJobAdressItems_Array[3]});

i++;
_root.application.Progress_prb.setProgress(i, nRowsInDataArraySet);
_root.application.Progress_prb.redraw(true);
}
clearInterval(intervalId);

***********

die while schleife ist so heftig unterwegs das noch nichteinmal der progressbar aktualisiert angezeigt wird !!

irgendein hinweiss ?

thx
deZomer ist offline   Mit Zitat antworten
Alt 26-01-2006, 22:21   #7 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg
Beiträge: 4.385
Hallo, da bist du auch auf der falschen Fährte, du musst die Schleife unterbrechen, während sie läuft, kann NICHTS anderes passieren.

Hier mal eine Beispielklasse, mit den public-Werten könnt ihr mal rumspielen, bei den aktuellen Werten läuft die „Berechnung“ bei mir 20 Sekunden bei 80% CPU-Last (natürlich ohne Warnung).

PHP-Code:
class Calculator
{
    
// Gesammtanzahl der zu tätigenden Rechenschritte, beispielsweise die Länge eines Arrays
    
public var totalSteps Number 200000;

    
// wieviele Schritte nacheinander ausgeführt werden, bis die vergangene Blockzeit überprüft wird
    
public var stepsPerTimeCheck Number 100;

    
// die Zeit, die einem Berechnungsblock zugestanden wird
    
public var timePerBlock Number 18;

    
// in welchem Abstand die Blöcke gerufen werden sollen
    
public var blockIntervalDelay Number 20;

    private var 
currentStep Number;
    private var 
blockCount Number;
    private var 
intervalId Number;
    public var 
calculationTime Number;
    private var 
calculationStartTime Number;

    public function 
calculate()
    {
        
trace("Los gehts");

        
// ein Zähler, könnte beispielsweise der Index in einem Array sein
        
currentStep 0;

        
// hier wird die reine Rechenzeit gespeichert
        
calculationTime 0;

        
// hier will ich wissen, in wieviele Teile die Berechnung zerlegt wurde
        
blockCount 0;

        
// um die Zeit des Gesammtvorgangs zu bestimmen
        
calculationStartTime getTimer();

        
intervalId setInterval(this"calculationBlock"blockIntervalDelay);

        
// damit nicht noch blockIntervalDelay am Anfang gewartet wird
        
calculationBlock();
    }

    
// diese Funktion versucht in der durch timePerBlock definierten Zeit so viel wie möglich zu tun.
    
private function calculationBlock()
    {
        var 
doneSteps Number;

        
blockCount++;

        var 
calculationBlockStartTime Number getTimer();

        
// diese Schleife prüft die vergangene Zeit
        
while ((getTimer() - calculationBlockStartTime) < timePerBlock) {
            
doneSteps 0;

            
// diese Schleife führt die Berechnung durch, immer stepsPerTimeCheck Schritte hintereinander,
            // dann lässt sie wieder eine Zeitüberprüfung zu
            
while ((currentStep totalSteps) && (doneSteps stepsPerTimeCheck)) {
                
doneSteps++;
                
currentStep++;

                
// hier rechnen, momentan nur Zeit verschlingen
                
for (var 0100i++);
            }
        }

        
calculationTime += (getTimer() - calculationBlockStartTime);

        if (
currentStep >= totalSteps) {
            
clearInterval(intervalId);

            
calculationFinished();
        }
    }

    private function 
calculationFinished()
    {
        
trace("Arbeit getan");
        
trace("Rechenzeit: " Math.round(calculationTime 1000) + "s");
        
trace("Gesammtdauer: " Math.round((getTimer() - calculationStartTime) / 1000) + "s");
        
trace("Berechnungsschritte: " blockCount);
    }

Die Ani liegt auf der Bühne, damit man sieht, das nebenher noch was zu machen ist.

Noch ein paar Kommentare zu den Einstellungsmöglichkeiten:
1) Umso schneller ein Berechnungsschritt ist, umso größer kann stepsPerTimeCheck sein
2) Umso gleichbleibender die Rechenzeit eines Rechenschrittes ist, umso besser kann man stepsPerTimeCheck einstellen, und umso näher kann timePerBlock an blockIntervalDelay liegen
3) Umso kleiner die Framerate sein muss, umso größer können stepsPerTimeCheck, timePerBlock und blockIntervalDelay sein.
4) Umso kleiner stepsPerTimeCheck und timePerBlock umso mehr Zeit geht für den Kontrollmechanismus selbst verloren.

Die Ausgaben Berechnungszeit und Gesammtzeit geben euch einen Eindruck, wie gut die Werte für die aktuelle Berechnung, auf dem aktuellen PC eingestellt sind, umso mehr sie abweichen, umso mehr kann man optimieren.

So, und jetzt schreibt bitte jemand sowas für rekursive Vorgänge

EDIT: Anhang wie immer vergessen
Angehängte Dateien
Dateityp: zip Calculator.zip (6,6 KB, 2x aufgerufen)
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)

Geändert von Janoscharlipp (26-01-2006 um 22:22 Uhr)
Janoscharlipp 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



Alle Zeitangaben in WEZ +1. Es ist jetzt 12:34 Uhr.

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


Copyright ©1999 – 2014 Marc Thiele