Forums Développement Multimédia

Aller au contenu

Priorité chargement fichiers par rapport à une boucle for

code boucle

6 réponses à ce sujet

#1 Cortux

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 357 messages

Posté 10 April 2017 - 14:03 PM

Bonjour à tous.

Me revoilà pour une nouvelle question.

Je dois charger plusieurs fichiers afin de récupérer, trier, et renvoyer leur contenu. Ils sont nommés de façon alphabétiques afin qu'ils puissent être appelés dynamiquement à travers une boucle for.

Le problème c'est que lorsque je charge le fichier1.txt, je n'ai pas le temps d'aller au onComplete qui appelle d'autres instructions que la boucle passe déjà à l'indice suivant 2.

J'ai fait des trace, le nom des fichiers est correctement construit, mais il ne se passe rien de plus.


for (var n=1; n< 6; n++)
{
         var conteneurHTML:URLLoader = new URLLoader();
         var fichier:URLRequest = new URLRequest("Texte"+(i+2)+".html"); // i est un indice de boucle au niveau supérieur.
         conteneurHTML.addEventListener(IOErrorEvent.IO_ERROR, indiquerErreurHTML);
         conteneurHTML.addEventListener(Event.COMPLETE, onCompleteHTML);
         conteneurHTML.load(fichier);
                 
         function indiquerErreurHTML(event:Event)
          {
           texte_dynamique.htmlText = "Pas de texte HTML associé";
          }
                         
         function onCompleteHTML(event:Event):void
          {
           trace("Entrée fonction complete HTML");
           contenuTexteCOMM = event.target.data;
           trace(contenuTexteCOMM);
          }                            
}
 

Auriez-vous une idée afin de prioriser le chargement et l'analyse du fichier afin d'avoir 5 fois le "trace(contenuTexteCOMM);" au lieu de rien du tout ?

Merci par avance pour vos réponses !

N.B : Un timer pourrait être une solution, mais je pense que ce serait du bidouillage.

#2 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6917 messages

Posté 10 April 2017 - 14:36 PM

Salut,

Une fonction récursive avec une condition de sortie devrait faire la blague.
L'idée est la suivante en pseudo code :


function chargeScript(monscript){

charge le fichier concerné (monscript)
quand le fichier est chargé
        regarde si il reste des fichiers à charger
                si oui relance la fonction avec le nouveau script à charger (mon autre script)
                sinon return
}
 

PS : au passage beaucoup d'erreurs dans ton code.
Sortir la déclaration des variables de la boucle (inutile de les redéclarer à chaque itération)
Ne pas mettre de fonctions dans la boucle (inutile de recréer les mêmes à chaque itération)
Ne pas utiliser le nom des fichiers pour les traiter, les passer dans un tableau et traiter le tableau, cela permet de factoriser le code et le rendre beaucoup plus souple si tu as des fichiers à ajouter ou retirer

EDIT : je n'ai pas testé le code mais ceci devrait te mettre sur la voie

var mesfichiers:Array = ["fichier1.txt","fichier2.txt","fichier3.txt","fichier4.txt"];
var loader:URLLoader = new URLLoader();
var request:URLRequest;
chargeFichiers(mesfichiers[0])

function chargeFichiers(fichier):void{
                 request = new URLRequest(fichier);
                 loader.addEventListener(IOErrorEvent.IO_ERROR, indiquerErreurHTML);
                 loader.addEventListener(Event.COMPLETE, onCompleteHTML);
                 loader.load(fichier);
}

function indiquerErreurHTML(event:Event){
                 texte_dynamique.htmlText = "Pas de texte HTML associé";
}

function onCompleteHTML(event:Event):void {
                 trace("Entrée fonction complete HTML");
                 contenuTexteCOMM = event.target.data;
                 trace(contenuTexteCOMM);
                 mesfichiers.shift(); // retire le premier élément du tableau
                 if(mesfichiers.length>0){
        chargeFichiers(mesfichiers[0])
     }
}  


#3 Cortux

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 357 messages

Posté 10 April 2017 - 15:07 PM

Bonjour Monsieur Spi,

Tout d'abord, je n'ai pas compris ta première phrase :

Voir le messageMonsieur Spi, le 10 April 2017 - 14:36 PM, dit :

Une fonction récursive avec une condition de sortie devrait faire la blague.

Ensuite, les remarques sur les erreurs :
- Pour les variables, c'est tout à fait exact, je les déclare dans les boucles, ça fonctionne, mais c'est pas terrible, mauvaise manie à changer.
- Pour la fonction, elle était au départ à l'exterieur et apellée dans la boucle, à force de faire des tests, j'ai fini par aboutir à un code "moche" alors qu'au début il était correct.
- Pour les noms de fichiers, j'ai à la base un
filesChapitres.getDirectoryListing();
donc un tableau comme tu me l'as recommandé, ces HTML en sont une conséquence.


Je n'ai pas mis tous les détails car c'était vraiment une question sur un principe de fonctionnement, mon code en étant un exemple. Je fais de l'AS3 niveau amateur occasionnellement depuis 10 ans et ces notions de logiques de calcul m'échappent encore complètement. Je n'y comprends rien de rien.

A titre d'explication : si je mets la fonction à l'exterieur histoire que ce soit propre, pour moi le player doit en toute logique à n=1 aller dans la fonction, mettre sur pause le for, exécuter tout ce qu'il y a dans la fonction dont le chargement du fichier html et son analyse, et une fois que toutes les instructions de la fonction sont faites, passer à l'indice de boucle suivant n=2. Mais ça ne marche pas ! Je suis dans l'erreur bien évidemment, mais j'aimerai comprendre le principe de fonctionnement, à savoir pourquoi la fonction est exécutée mais pas les chargements de fichiers qu'elle contient et les instructions qui y sont associées.

Si tu pouvais m'éclairer sur ce sujet (au delà du code) ce serait top, si tu en as le temps et l'envie !

Merci par avance :)

#4 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6917 messages

Posté 10 April 2017 - 16:39 PM

Citation

pour moi le player doit en toute logique à n=1 aller dans la fonction, mettre sur pause le for,
nan, la boucle continue de s'exécuter indépendamment de ton autre fonction, on est dans un principe asynchrone, c'est à dire que les traitements sont dissociés et que la boucle n'attend pas le résultat te ton autre fonction pour s’exécuter, c'est là qu'est le problème justement.
Et c'est aussi un piège de mettre une fonction dans une autre fonction ou dans une boucle, on pense que le traitement va se faire dans un certain ordre mais non, justement et heureusement, non :)

Dans ton cas, tu dois écouter l'événement onComplete avant de charger le script suivant, c'est pour ça que ta boucle ne marche pas et que je te recommande une fonction récursive ou un rappel après le onComplete.

Pour la récursivité : https://fr.wikipedia..._r%C3%A9cursive
Pour simplifier : "En informatique, les fonctions récursives sont des fonctions dont le calcul nécessite d'invoquer la fonction elle-même"
C'est ton cas, la fonction qui charge les scripts est une seule et même fonction qui s'appelle elle même avec la référence du script suivant lorsque le script précédent à terminé d'être chargé. (en fait c'est la fonction onComplete qui relance la fonction de chargement du script, ce n'est pas tout à fait de la récursivité, mais ces fonctions vont s'appeler en boucle jusqu'à ce qu'elles trouvent une porte de sortie, la fameuse condition de sortie, qui peut s'exprimer ainsi : "si tous les scripts sont chargés on arrête de les charger", ce qui se traduit chez toi par : "si je suis a la fin de mon tableau qui a listé les scripts")

dans ton cas, la fonction déclenche le loading du premier script du tableau, lance les traitements, puis lorsque ton script est terminé, relance cette même fonction avec comme paramètre le second script a charger.

#5 Cortux

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 357 messages

Posté 11 April 2017 - 10:23 AM

Salut Monsieur Spi,

J'ai lu ton message hier soir, et j'allais te demander un exemple afin de mieux comprendre le sens de ton propos, et j'ai trouvé l'EDIT ce matin donc c'est parfait :).

Effectivement, je vois beaucoup mieux ce que tu veux dire, remplacer une boucle for par une fonction qui s'appelle elle-même jusqu'à remplir une condition particulière. Pour le coup, tu as raison, ça va répondre à ma problèmatique de synchro. Cependant, je te rassure, le bout de code que tu as mis ne pourra pas être utilisé en l'état, juste ou faux, je n'ai mis qu'un bout de programme, il va falloir que je l'adapte, mais le but étant que je comprenne, c'est parfait !

Je ne dis pas que je vais y arriver, mais j'ai déjà compris, c'est un bon début.

Un mystère subsiste :


function chargeFichiers(fichier):void{
 

Que représente "fichier" ?

Je reviens vers toi dès que j'ai suffisamment avancé ;)

Merciiiiiiiiiiiiiiiiiiiii !

Tux

#6 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6917 messages

Posté 11 April 2017 - 10:28 AM

Citation

Que représente "fichier" ?

La valeur que tu souhaite, il s'agit d'un paramètre de fonction, vois ça comme une variable locale à la fonction.

Par exemple :


var nombre1:Number = 10;
var nombre2:Number = 5;

function multiplier(A, B ):Number{
return A*B;
}

var resultat:Number = multiplier(nombre1, nombre2);
 

Dans ton cas tu veux récupérer le nom du fichier à charger à chaque passage dans la fonction.
Ta fonction attend donc une valeur pour "fichier", cette valeur tu la récupère dans le tableau qui liste tous tes fichiers et il s'agit d'une String qui représente le nom du fichier à charger. L'astuce c'est de passer d'index en index de ton tableau à chaque fois que ton écouteur onComplete est déclenché (donc à chaque fois qu'il a fini de charger le fichier précédent).

#7 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6917 messages

Posté 11 April 2017 - 10:39 AM

Si tu veux travailler sur la récursivité tu peux regarder cet exercice : http://forums.mediab...rcice_-_cascade



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

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

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP