Forums Développement Multimédia

Aller au contenu

Chargement XML successifs

CODE Actionscript

10 réponses à ce sujet

#1 Cortux

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 357 messages

Posté 19 August 2013 - 12:11 PM

Bonjour à tous Image IPB

Je vous expose mon souci. Il se situe au niveau des chargements XML au sein d'une boucle. J'avais réussi à trouver un moyen pour un autre problème lié au chargement d'images à l'aide d'un timer. Mais là le problème est bien plus aléatoire en temps de calcul.

Plus précisément : dans une boucle for, je reconstitue une adresse vers un XML, je charge le XML et je récupère du contenu que j'écris dans une variable. Une fois tous ces XML analysés et ma variable remplie progressivement (à la sortie de la boucle), j'écris le contenu de cette variable dans un fichier texte que j'écris sur le disque.

Grossièrement avec deux XML à analyser, en traçant, j'obtiens du :

1 - Je rentre dans la boucle
2 - J'écris ma variable dans un fichier texte et je crée le fichier texte sur le disque
3 - Je remplis ma variable avec le XML 1.
4 - Je remplis ma variable avec le XML 2.

L'étape 2 devrait se situer à la fin en toute logique. Cela pourrait s'appliquer à des images pour faire des captures d'écran etc etc, j'ai volontairement omis le code pour essayer de comprendre globalement comment procéder. Mais s'il y a besoin de code pour éclaircir je déposerai sans problème, ya qu'à demander Image IPB

Merci par avance pour vos réponses, je continue de chercher de mon côté.

Tux.

#2 Benzouye

  • Members
  • PipPipPipPipPipPipPipPip
  • 583 messages

Posté 19 August 2013 - 12:35 PM

Bonjour,

Je pense qu'un bout de code simplifié serait utile pour voir comment tu imbriques tes étapes.
Dans la logique, tu devrais utiliser une fonction pour ton étape 2 qui n'est appelée QUE lorsque tous tes XML ont été traités ...
Benzouye
Travaille avec FlashDevelop 4 + Flex SDK 4.6 open source

#3 Cortux

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 357 messages

Posté 19 August 2013 - 13:12 PM

Edit : Je charge un XML juste avant avec du (onComplete,chargementCompletPetales) dans lequel je vais récupérer les adresses des XML utilisés plus bas.

Aucun problème, voici le code :


function chargementCompletPetales(pEvt:Event)
{
  adressesPetales = new XML(pEvt.target.data);
  for (var i=0;i<adressesPetales.resource.length();i++)
   {
        XMLPetales = new URLRequest("../adresseXML/");
        chargementXMLPourPetales = new URLLoader();
        chargementXMLPourPetales.addEventListener( Event.COMPLETE, creationHTML);
        chargementXMLPourPetales.load( XMLPetales );
        //contenuPetales += "Texte ajouté , ";
        if ((i+1) == adressesPetales.resource.length()) {creerFichierHtml();}
   }

}
function erreurPetales(event:Event)
{

}

function creationHTML(event:Event)
{
  trace("J'incrémente ma variable.");
}

function creerFichierHtml()
{
  var file:File = new File(File.applicationDirectory.nativePath);
  file = file.resolvePath("fichier.html");
  var fileStream:FileStream = new FileStream();
  fileStream.open(file, FileMode.WRITE);
  fileStream.writeUTFBytes(contenuPetales);
  fileStream.close();
}
 

J'ai enlevé pas mal de contenu non pertinant comme à mon habitude, la fonction erreurPetales est apellée ailleurs, mais l'esentiel est là.

Edit #2 : Présenté comme cela, Flash me renvoie une erreur spécifiant que contenuPetales, pour créer le fichier physique n'existe pas, au cas où ce serait utile à la compréhension.

#4 Benzouye

  • Members
  • PipPipPipPipPipPipPipPip
  • 583 messages

Posté 19 August 2013 - 13:29 PM

Merci pour le code.

Tu lances ta fonction creerFichierHtml dans ta boucle for, c'est à dire lorsque tu lances le chargement de tes XML.
Du coup je pense qu'il te suffit de déplacer l'appel à creerFichierHtml dans ta fonction creationHtml.
Ceci va t'imposer de créer deux nouvelles variables pour stocker le nombre de fichiers à traités et le nombre de fichiers traités et les utiliser dans ton if.

Un truc du genre :
var nbPetales:int = 0;
var compteur:int = 0;

function chargementCompletPetales(pEvt:Event) {
        nbPetales = adressesPetales.resource.length;
       
        adressesPetales = new XML(pEvt.target.data);
        for (var i=0 ; i < nbPetales ; i++ ) {
                // ...
        }
}

function creationHTML(event:Event) {
        compteur++;
        // ...
        if ( compteur == nbPetales ) creerFichierHtml();
}

function creerFichierHtml() {
        // ...

        // réinitialiser les variables pour le prochain appel
        compteur = 0;
        nbPetales = 0;
}

Benzouye
Travaille avec FlashDevelop 4 + Flex SDK 4.6 open source

#5 Cortux

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 357 messages

Posté 19 August 2013 - 14:02 PM

Hello Benzouye,

Cela me semble être une excellente idée. En effet, faire ce même test dans creationHTML pourrait donner un résultat différent. Mais j'aime poser des questions, existe-t-il une logique de chargement multiple de XML. Si une fonction charge dynamiquement des XML, comment expliquer à cette fonction ou boucle qu'elle doit attendre la fin du chargement XML pour passer au chargement suivant ? Pour ce que j'en pense, une fonction est cartésienne et ne prend pas en compte les notions de temps, d'où mon incompréhension, enfin cela parait paradoxal.

Sinon est-ce que les instructions et calculs s'empilent dans la liste des tâches du processeur ? Je m'explique. Je lance le XML1, le XML 2 arrive, si le traitement du 1 n'est pas finit, est-ce que ce numéro est squizzé pour passer au numéro 3 ou est-il mit en file d'attente ? Ou alors est-ce que le processeur gère tout ça en même temps ? Je sais pas si je suis clair, mais voilà au delà de ce cas particulier, cela reflète mon interrogation.

Merci par avance pour vos réponses, et merci pour tes lumières Benzouye, je vais tester ta proposition immédiatement ! Image IPB

Tux.

#6 Cortux

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 357 messages

Posté 19 August 2013 - 14:18 PM

Me revoilà, pour ce qui est du test direct, ta méthode fonctionne parfaitement. J'ai plusieurs fonctions assez conséquentes de tri dans creationHTML, on va voir si cela continue à bien se dérouler en augmentant le temps de calcul :)

Je te tiens au courant.

Tux.

#7 Benzouye

  • Members
  • PipPipPipPipPipPipPipPip
  • 583 messages

Posté 19 August 2013 - 14:23 PM

Pour une gestion fine des chargements, je te propose de regarder la classe LoaderMax de Greensock (les mêmes qui font TweenMax). Il y a même une sous-classe XMLLoader ... à voir si cela peut t'intéresser.

Pour ce qui est de la façon dont le processeur traite les piles de chargement, je n'en sais rien ... peut-être qu'une âme plus experte passera par là ... ce qui est sûr, c'est qu'il est très peu probable qu'un fichier soit "squizzé". Tous seront traités, le temps dépendra de la capacité de ton processeur.
Benzouye
Travaille avec FlashDevelop 4 + Flex SDK 4.6 open source

#8 Cortux

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 357 messages

Posté 19 August 2013 - 14:30 PM

Voir le messageBenzouye, le 19 August 2013 - 14:23 PM, dit :

Tous seront traités, le temps dépendra de la capacité de ton processeur.

Cela sous-entend que les calculs s'empilent en file d'attente, et ça c'est rassurant. Après est-ce que cela a un impact sur l'ordre d'exécution, je vais me pencher sur la suite, je vais rapidement avoir une réponse Image IPB. On verra si des experts en la matière auront la gentillesse de nous éclairer là-dessus en parallèle.

Merci Benzouye !

#9 Benzouye

  • Members
  • PipPipPipPipPipPipPipPip
  • 583 messages

Posté 19 August 2013 - 15:33 PM

Voir le messageCortux, le 19 August 2013 - 14:30 PM, dit :

Après est-ce que cela a un impact sur l'ordre d'exécution
Un gros fichier prendra plus de temps à charger qu'un petit, c'est "mathématique". Donc en lançant le chargement d'un gros fichier, puis d'un petit derrière, le onComplete du petit sera déclenché avant celui du grand ... Donc ton petit fichier sera exploité avant le grand dans ton code, même si tu as lancé le chargement avant.
Pour gérer un ordre de chargement, il faudrait créer une variable de priorité dans tes XML. Tu pourrais positionner tes XML chargés dans un tableau.
Une fois tous tes XML chargés, en bouclant sur ton tableau, la variable te permettrait de les traiter dans l'ordre ...

Par contre, oubli le lien précédent vers LoaderMax, en fait la sous-classe XMLLoader n'est pas du tout adapté à ton besoin.

Voir le messageCortux, le 19 August 2013 - 14:30 PM, dit :

Merci Benzouye !

Pas de quoi Cortux !

Bonne continuation.
Benzouye
Travaille avec FlashDevelop 4 + Flex SDK 4.6 open source

#10 draad

  • Members
  • PipPipPipPipPipPipPipPip
  • 654 messages

Posté 19 August 2013 - 19:32 PM

Coucou,

Une petite proposition de solution, je ne sais pas si c'est "la bonne façon" mais c'est comme ça que je ferais :


private var xmlList:Array = [xml1, xml2, xml3, xml4];

private function loadXml ():void
{
    var targetXmlPath:String = xmlList:Array[0];
    xmlList:Array.splice(0,1);
    ...
    ...
    // ici tu charge seulement le premier xml du tableau
    // puis tu supprime le premier element de ton tableau
}

private function onXmlLoaded (e:Event):void
{
    // ici tu fais ton traitement un par un

    if(xmlList:Array.length > 0)
    {
         loadXml ();
         // s'il reste des xml a charger alors on retourne dans la boucle
    }
    else
    {
         // sinon tu peux continuer ton programme
    }
}
 


#11 Cortux

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 357 messages

Posté 26 August 2013 - 09:15 AM

Bonjour Bonjour Image IPB

Je reviens vers vous pour vous faire partager ma solution. C'est pas une vraie solution mais je me suis inspiré de vos réponses. Le problème que j'avais avec mes différents XML, c'est que cela fonctionnait bien avec vos propositions, mais l'écriture du fichier se faisait tout à la fin. Au lieu d'avoir 5 fichiers avec chacun leur contenu récupéré dans les XML, ben j'avais un seul fichier avec tout dedans.

J'ai donc utilisé votre proposition d'avoir tous les XML à traiter dans un tableau, excellente idée, et ensuite j'ai mis un timer dans lequel j'analyse les XML et j'ai ramené la fonction de création physique du fichier dans creationHTML, ce qui me donne bien des fichiers distincts avec leur contenu.

Je n'ai aucune obligation de rapidité ni de performance, dans le pire des cas, la méthode prendra 200s maximum, j'ai placé un timer comme indication de temps. Mais comparé à la méthode manuelle qui prenait plusieurs jours, ça laisse une sacrée marge Image IPB

Est-il utile de placer le code dernière version sachant que le fond présenté plus haut n'a pas changé ? Juste l'ordre d'éxécution ?

Merci pour l'idée du tableau, ça m'a permis d'explorer une autre piste qui a aboutie Image IPB

Tux.



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

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