Forums Développement Multimédia

Aller au contenu

Temporisation onComplete

CODE Actionscript

7 réponses à ce sujet

#1 Cortux

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 357 messages

Posté 25 June 2013 - 12:06 PM

Bonjour à tous :)

Je bute sur un problème lié à des onComplete en cascade qui à mon avis s'entremêlent les uns les autres, je suspecte même que les variables se confondent, ce qui dans le fond serait logique. Le problème, c'est que je ne sais pas du tout comment mettre de l'ordre là-dedans.

Voici mon code le morceau de programme incriminé !


BTNADDALL.addEventListener(MouseEvent.CLICK,addAllList)
function addAllList (event:MouseEvent)
        {
                determinationNumerotation();
        }

//Cette partie de code peut être lancée 1 fois comme 50 fois en fonction de la valeur de tableauLiensHTML

var occurenceBalise = 0;
function determinationNumerotation()
{
  var nombrePages = Math.ceil(tableauSommaire.length/40);
  numerotationInitiale = 1 + nombrePages + 1 ;
  viderTableau(tableauNumerotation);
  tableauNumerotation.push(numerotationInitiale);
  for (var i=0;i<tableauLiensHTML.length;i++)
         {
         var fichier:URLRequest = new URLRequest(tableauLiensHTML[i]);
         var conteneurHTML:URLLoader = new URLLoader();
         conteneurHTML.addEventListener(Event.COMPLETE, onCompleteHTML);
         conteneurHTML.load(fichier);
        }
}

function onCompleteHTML(event:Event):void
  {
   occurenceBalise = 0;
   var texteHTML = event.target.data;
   var balise = "<div id=\"fond\">";
   var debut = 0;
   var indiceSearch = 0;
   while (indiceSearch != -1)
        {
         indiceSearch = texteHTML.indexOf(balise,debut);
         if (indiceSearch != -1)
          {
           occurenceBalise++;
           debut = indiceSearch+20;
          }
         }
        numerotationInitiale += occurenceBalise;
        tableauNumerotation.push(numerotationInitiale);
   }
 

Le tableau "tableauLiensHTML" contient toutes les URL des fichiers HTML que je dois analyser et de chaque analyse doit ressortir un chiffre, que je classe dans un tableau pour le réutiliser plus tard.

Après tests, il semblerait que tout cela se passe bien lorsque je lance cette partie de programme au coup par coup, 4 fois à la suite, au delà, les chiffres sont faussés.

Auriez-vous une idée du problème ? Serait-ce un problème de temporisation comme indiqué dans le sujet ?

Merci par avance pour vos réponses.

Tux.

#2 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1918 messages

Posté 25 June 2013 - 12:58 PM

relance
conteneurHTML.load(fichier);
après chaque Event.COMPLETE plutôt que dans une boucle for

#3 Krevare

    Ceinture Noire

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 923 messages

Posté 25 June 2013 - 12:59 PM

Un peu au pif mais par hasard ta fonction
viderTableau[color=#66cc66]([/color]tableauNumerotation[color=#66cc66])[/color];
est-elle bien lancée ?

J'ai parcouru d'un oeil mais il semble que tu réinitialises bien tes variables, donc le soucis viens peut-être de là...

Après tu peux typer tes variables pour éviter de mauvaises surprises aussi :
http://www.adobe.com...data-types.html

My 2 cents :)

Fred.

#4 Benzouye

  • Members
  • PipPipPipPipPipPipPipPip
  • 583 messages

Posté 25 June 2013 - 13:19 PM

Salut Cortux,

A première lecture, ton code semble correct. La fonction onCompleteHTML étant appelé individuellement pour chaque conteneurHTML, il ne devrait pas y avoir de conflit ...

Par contre j'ai plusieurs remarques et questions :
  • A quoi te sert la fonction addAllList puisqu'elle ne fait que lancer determinationNumerotation ? Tu pourrais la supprimer ...
  • +1 Krevare pour le typage, cela peut éviter des surprises ...
  • -1 pol2095, chaque conteneurHTML est un objet indépendant avec un load propre, la boucle for devrait être bonne ...
  • Où déclares-tu et quels sont les types des variables numerotationInitiale et tableauNumerotation ?
En tenant compte de ces remarques, essayes peut-être ceci :

BTNADDALL.addEventListener(MouseEvent.CLICK,determinationNumerotation);
var occurenceBalise:int = 0;

function determinationNumerotation()
{
   var nombrePages:int = Math.ceil(tableauSommaire.length/40);
   numerotationInitiale = 1 + nombrePages + 1 ;
   viderTableau ( tableauNumerotation );
   tableauNumerotation.push ( numerotationInitiale );
   
   for ( var i=0 ; i < tableauLiensHTML.length ; i++ )
   {
          var fichier:URLRequest = new URLRequest(tableauLiensHTML[i]);
          var conteneurHTML:URLLoader = new URLLoader();
          conteneurHTML.addEventListener(Event.COMPLETE, onCompleteHTML);
          conteneurHTML.load(fichier);
   }
}

function onCompleteHTML(event:Event):void
{
   occurenceBalise = 0;
   var texteHTML:String = event.target.data;
   var balise:String = '<div id="fond">';
   var debut:int = 0;
   var indiceSearch:int = 0;
   
   while (indiceSearch != -1)
   {
          indiceSearch = texteHTML.indexOf(balise,debut);
          if ( indiceSearch != -1 ) occurenceBalise++;
          debut = indiceSearch + 1;
   }
   
   numerotationInitiale += occurenceBalise;
   tableauNumerotation.push(numerotationInitiale);
}

Benzouye
Travaille avec FlashDevelop 4 + Flex SDK 4.6 open source

#5 Benzouye

  • Members
  • PipPipPipPipPipPipPipPip
  • 583 messages

Posté 25 June 2013 - 13:28 PM

Par contre, je ne vois pas l'intérêt de rechercher plusieurs fois une <div> de même id sur un fichier HTML ... si celui-ci est bien fait, un id ne doit apparaître qu'une fois ... non ? sinon il faut utiliser class plutôt que id ...

Si je comprends bien, ton bout de code stocke dans un tableau le nombre cumulé de fois ou apparait <div id="fond"> dans une liste de fichier HTML ? C'est bien cela ? Du coup quel est ton besoin final ?
Benzouye
Travaille avec FlashDevelop 4 + Flex SDK 4.6 open source

#6 Cortux

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 357 messages

Posté 25 June 2013 - 13:54 PM

Merci à tous pour vos réponses, je vais me pencher sur chacune d'entre-elles. Mais d'abord des précisions car en effet je n'ai donné que l'essentiel des informations pour ne pas inonder le post :).

Alors dans l'ordre :

Voir le messageKrevare, le 25 June 2013 - 12:59 PM, dit :

Un peu au pif mais par hasard ta fonction
viderTableau[color=#66cc66]([/color]tableauNumerotation[color=#66cc66])[/color];
est-elle bien lancée ?

J'ai parcouru d'un oeil mais il semble que tu réinitialises bien tes variables, donc le soucis viens peut-être de là...

Après tu peux typer tes variables pour éviter de mauvaises surprises aussi :
http://www.adobe.com...data-types.html

My 2 cents Image IPB

Fred.

Oui la fonction se lance bien pour ce que j'en vois, avec des tests en série, j'ai toujours le bon nombre d'éléments attendus dans le tableau, j'ai déduis qu'il était bien vidé à chaque fois. Pour les variables, je sais ! J'essaie d'en typer un maximum mais j'oublie toujours les variables de type simple comme des int,string et autres, à ma décharge. J'y travaille tous les jours et je progresse mais merci de le relever !

Ensuite
  • A quoi te sert la fonction addAllList puisqu'elle ne fait que lancer determinationNumerotation ? Tu pourrais la supprimer ...
  • +1 Krevare pour le typage, cela peut éviter des surprises ...
  • -1 pol2095, chaque conteneurHTML est un objet indépendant avec un load propre, la boucle for devrait être bonne ...
  • Où déclares-tu et quels sont les types des variables numerotationInitiale et tableauNumerotation ?
1 - Il y a du contenu utile pour l'application dans cette fonction que j'ai enlevé, mais pas utile pour la compréhension du post.
2 - Entièrement d'accord
3 - A tester pourquoi pas, on sait jamais.
4 - Plus haut dans l'application :

var tableauNumerotation:Array = new Array;
var numerotationInitiale:int;
 

Enfin,

Voir le messageBenzouye, le 25 June 2013 - 13:28 PM, dit :

Par contre, je ne vois pas l'intérêt de rechercher plusieurs fois une <div> de même id sur un fichier HTML ... si celui-ci est bien fait, un id ne doit apparaître qu'une fois ... non ? sinon il faut utiliser class plutôt que id ...

Si je comprends bien, ton bout de code stocke dans un tableau le nombre cumulé de fois ou apparait <div id="fond"> dans une liste de fichier HTML ? C'est bien cela ? Du coup quel est ton besoin final ?

Je créé de toute pièce une page HTML dans laquelle se trouve X pages construites de la même façon, comme un livre à plat de haut en bas :). En recherchant cette <div> je sais de combien de page est constitué mon HTML. Et pourquoi cela, c'est pour créer un sommaire avec numérotation des pages automatiques. Comme dit plus haut, le principe est correct, mais il y a caffouillage à un moment d'où ma question initiale !

Je planche sur vos propositions ! Merci encore !

A plus tard.

Tux.

#7 Cortux

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 357 messages

Posté 27 June 2013 - 08:03 AM

Bonjour à tous,

A défaut d'avoir trouvé une explication à ce comportement étrange de onComplete dans une boucle for, j'ai changé de méthode. Je viens la poster dans l'optique que ça pourrait servir à quelqu'un un jour :).

En fait j'ai remplacé la boucle for par un timer, pour être sûr que chaque calcul ait le temps de s'effectuer. Dans le cadre de l'application, le délai d'attente serait de 8s maximum, bien moins efficace qu'un for, mais cela reste infime en vue du service rendu. Voici mon code :


var timerSommaire:Timer;
var indiceBoucle = 0;
var nombrePages:int;
var occurenceBalise:int = 0;
var fichierHTML:URLRequest;
BTNADD.addEventListener(MouseEvent.CLICK,addList)
function addList (event:MouseEvent)
{
  // Des instructions se trouvaient ici, pas pertinentes pour le sujet
  lancementTimer();
}

function finSommaire(event:TimerEvent)
{
  BTNGENSpe.visible = true;
  indiceBoucle = 0;
  chargement.gotoAndStop(1);
}

function lancementTimer()
{
  chargement.gotoAndPlay(3); // loading
  viderTableau(tableauNumerotation);
  tableauLiensHTML.sort();
  nombrePages = Math.ceil(tableauSommaire.length/40);
  numerotationInitiale = 1 + nombrePages + 1 ;
  tableauNumerotation.push(numerotationInitiale);
  timerSommaire = new Timer(100,tableauLiensHTML.length)
  timerSommaire.start();
  timerSommaire.addEventListener(TimerEvent.TIMER,determinationNumerotation);
  timerSommaire.addEventListener(TimerEvent.TIMER_COMPLETE, finSommaire);
  affichageTableau(tableauSommaire); // affichage utlisateur
}

function determinationNumerotation(event:TimerEvent)
{
  fichierHTML = new URLRequest(tableauLiensHTML[indiceBoucle]);
  var conteneurHTML:URLLoader = new URLLoader();
  conteneurHTML.addEventListener(Event.COMPLETE, onCompleteHTML);
  conteneurHTML.load(fichierHTML);
}

function onCompleteHTML(event:Event):void
  {
   occurenceBalise = 0;
   var texteHTML:String = event.target.data;
   var balise:String = "<div id=\"fond\">";
   var debut:int = 0;
   var indiceSearch:int = 0;
   while (indiceSearch != -1)
    {
         indiceSearch = texteHTML.indexOf(balise,debut);
         if (indiceSearch != -1)
          {
           occurenceBalise++;
           debut = indiceSearch+20;
          }
         }
    numerotationInitiale += occurenceBalise;
    tableauNumerotation.push(numerotationInitiale);
    indiceBoucle++;
   }
 

Si vous avez des remarques en passant, je suis preneur. Merci en tout cas pour vos réponses, ça m'a donné quelques pistes de réflexion.

Bonne journée à tous :)

Tux.

#8 Benzouye

  • Members
  • PipPipPipPipPipPipPipPip
  • 583 messages

Posté 27 June 2013 - 12:22 PM

Salut Cortux,

Je suis surpris ... et cela donne raison à pol2095 ...
Du coup, plutôt que d'attendre ton timer, tu pourrais suivre son conseil :

Voir le messagepol2095, le 25 June 2013 - 12:58 PM, dit :

relance
conteneurHTML.load(fichier);
après chaque Event.COMPLETE plutôt que dans une boucle for
Cela te permettra de gagner un peu de temps d'exécution.

Si quelqu'un d'autre passe par là et trouve une explication au plantage de la boucle for ... je suis curieux.

Content que cela fonctionne en tout cas !
Benzouye
Travaille avec FlashDevelop 4 + Flex SDK 4.6 open source



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)