Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    Problema di sincronizzazione

    Ciao a tutti ,
    Il mio problema è il seguente:
    ho dei dati organizzati un file xml, ho quindi l'esigenza di caricare i suddetti dati per poterli utilizzare nella mia applicazione; di conseguenza ho creato una classe che gestisce appunto le operazioni di estrapolazione di dati dal file xml.
    Per essere più chiaro il codice actionscript nel mio stage è il seguente:
    Codice PHP:
    import navigazioneXML// è la classe di cui ho appena parlato
    var rosa : Array = navigazioneXML.ApriXML("Italia"); 
    trace(rosa.length); 
    il metodo apriXML restituisce un array che contiene i dati del file xml.
    Questo è un estratto di quello che faccio nel metodo ApriXML:


    Codice PHP:
    public static function ApriXML(nazione:String):Array {         
    filexml "C:/Users/William Lawson/Documents/Università/ppm/Progetto PPM/Contents/xml/"+nazione+".xml";         
    rosa = new Array();         //attributo di classe
    myarray = new Array();     //attributo di classe    
    mioxml = new XML();         //attributo di classe
    mioxml.load(filexml);         
    mioxml.onLoad = function(success) {             
             if (
    mioxml.loaded) {                 
                
    myarray mioxml.childNodes;                 
                
    rosa Dati();                             
             }         
    };         
    return 
    rosa
    La funzione Dati richiamata nel listener si occupa realmente di recuperare i dati di inserirli in un array e di ritornare lo stesso.
    Ora il problema è: quando viene eseguita l'istruzione load dell'oggetto mioxml, si entra nel blocco del listener, ma suppongo che questo venga eseguito "in contemporanea" con il blocco della funzione; ho ragione di credere questo perchè il trace contenuto nello livello actionscript dello stage(primo blocco di codice) mi stampa 0(vettore vuoto)

    C'è un modo per risolvere questo inconveniente( uso actionscript2).
    Grazie in anticipo.
    Ciao

  2. #2
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    Gli eventi come quelli che richiedono un caricamento esterno, sono asincroni, di conseguenza non è possibile gestire le informazioni richieste fino a che queste non sono disponibili, cosa che accade solo a caricamento avvenuto e che di solito è possibile monitorare grazie a funzioni che vengono attivate nel momento in cui un determinato evento ha luogo.
    Di conseguenza non è possibile gestire la cosa come hai fatto nella classe, perchè in ogni caso, per avere i dati disponibili nel codice devi aspettarne il caricamento e dovresti gestirlo con una funzione da richiamare nell'evento.

  3. #3
    Grazie per aver risposto ,

    allora vediamo se ho capito bene: il problema è da attribuire al fatto che ho implementato un listener di eventi all'interno di un metodo della classe?? :master:

    In questo caso and80 cosa mi suggerisci per ovviare a ciò??

  4. #4
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    ti stavo rispondendo e ho chiuso per sbaglio

    >>allora vediamo se ho capito bene: il problema è da attribuire al fatto che ho implementato un
    >>listener di eventi all'interno di un metodo della classe??

    No, il problema, o meglio il meccanismo di funzionamento di un caricamento esterno, ha necessità di un minimo di tempo per poter accedere ai dati, perciò dal momento in cui tu fai la richiesta (load) al momento in cui i dati sono utilizzabili (onLoad) il tuo array risulterà vuoto, di conseguenza, se vuoi usufruire di quei dati, lo puoi fare solo dentro onLoad.
    La cosa più semplice da fare è implementare una funzione dentro alla classe che venga richiamata nell'onLoad, così sei sicuro che il tuo array sarà "pieno" all'interno della funzione.

    codice:
    class navigazioneXML {
    	private static var filexml:String;
    	private static var rosa:Array;
    	private static var myarray:Array;
    	private static var mioxml:XML;
    	public static var onLoadInit:Function;
    	public static function ApriXML (nazione:String):Array {         
    		filexml = "C:/Users/William Lawson/Documents/Università/ppm/Progetto PPM/Contents/xml/"+nazione+".xml";         
    		rosa = new Array();         //attributo di classe
    		myarray = new Array();     //attributo di classe    
    		mioxml = new XML();         //attributo di classe
    		mioxml.load(filexml);         
    		mioxml.onLoad = function(success) {             
    			if (mioxml.loaded) {                 
    				myarray = mioxml.childNodes;                 
    				rosa = Dati();                             
    				onLoadInit();
    			}         
    		};         
    		return rosa;
    	}
    	public static function Dati () {
    		// [...]
    	}
    }
    E sul fla scrivi solamente:

    Codice PHP:
    navigazioneXML.onLoadInit = function () {
        var 
    rosa:Array = navigazioneXML.ApriXML("Italia");
        
    trace(rosa.length);


  5. #5
    ,

    Ma questa funzione onLoadInit viene eseguita all'esecuzione del filmato???

    Ma non si verebbe a creare un loop in questa maniera, visto che all'avvio viene eseguito onLoadInit che chiama navigazioneXML.ApriXML(), che a sua volta richiama la funzione onLoadInit, e così via??

    No, il problema, o meglio il meccanismo di funzionamento di un caricamento esterno, ha necessità di un minimo di tempo per poter accedere ai dati, perciò dal momento in cui tu fai la richiesta (load) al momento in cui i dati sono utilizzabili (onLoad) il tuo array risulterà vuoto, di conseguenza, se vuoi usufruire di quei dati, lo puoi fare solo dentro onLoad.
    Il problema mi è chiaro, quello che non riesco a capire è questo:
    se l'onLoad indica che il file xml è stato caricato( e quindi di conseguenza i dati sono disponibili), allora la funzione Dati() dovrebbe poter operare correttamente, ma questo purtroppo non avviene

  6. #6
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    Originariamente inviato da LordOfTaranto
    ,

    Ma questa funzione onLoadInit viene eseguita all'esecuzione del filmato???

    Ma non si verebbe a creare un loop in questa maniera, visto che all'avvio viene eseguito onLoadInit che chiama navigazioneXML.ApriXML(), che a sua volta richiama la funzione onLoadInit, e così via??
    Vero, non l'avevo considerato in effetti, bisogna cambiare qualcosa nel codice, ma la strada è quella.



    Originariamente inviato da LordOfTaranto
    Il problema mi è chiaro, quello che non riesco a capire è questo:
    se l'onLoad indica che il file xml è stato caricato( e quindi di conseguenza i dati sono disponibili), allora la funzione Dati() dovrebbe poter operare correttamente, ma questo purtroppo non avviene
    Certo che avviene, ma in un tempo che non può essere impostato da te, perciò se fai subito l'assegnazione var rosa:Array = navigazioneXML.ApriXML("Italia"); otterrai solo un array vuoto, poichè il codice della funzione verrà eseguito istantaneamente, ma l'evento non si verificherà subito e l'array non verrà riempito. Non riesco a spiegarti in maniera diversa e più dettagliata il concetto di asincronismo.

  7. #7
    ,

    Grazie innanzitutto per aver risposto, ho capito cosa intendi
    Se solo ci fosse un modo "per mettere in attesa" il flusso d'esecuzione nel .fla il problema l'avremmo già risolto; a proposito di questa soluzione ho postato su questo forum questo topic , chiedendomi se ci fosse in actionscript la possibilità di gestire i thread, a giudicare dalle risposte, penso che non ci sia un modo, è questo complica le cose

  8. #8
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    Il modo c'è, si tratta solo di modificare quello che già stavo scrivendo, se posti l'intero codice della classe e magari un esempio di xml che vuoi gestire, posso darti una mano in più senza fare errori.

  9. #9
    Codice della classe:
    Codice PHP:
    import giocatore
    class 
    navigazioneXML {     
           private static var 
    filexml:String;     
           private static var 
    myarray:Array;     
           private static var 
    rosa:Array;     
           private static var 
    mioxml:XML;          

           public static function 
    ApriXML(nazione:String):Array {         
             
    filexml "C:/Users/William Lawson/Documents/Università/ppm/Progetto PPM/Contents/xml/"+nazione+".xml";         
             
    rosa = new Array();         
             
    myarray = new Array();         
             
    mioxml = new XML();         
             
    mioxml.load(filexml);         
             
    mioxml.onLoad = function(success) {             
             if (
    mioxml.loaded) {                 
                  
    myarray mioxml.childNodes;                 
                  
    rosa Dati();             
             }         
           };         
           return 
    rosa;     
           }     
           
           private static function 
    Dati():Array {         
             var 
    k:Number;         
             for (
    k=0k<=myarray.lengthk++) {             
                  if (
    myarray[k].nodeName == "giocatore") {                 
                       
    rosa.push(new giocatore(myarray[k].attributes.nomemyarray[k].childNodes[0].childNodesmyarray[k].childNodes[1].childNodesmyarray[k].childNodes[2].childNodesmyarray[k].childNodes[3].childNodes"nessuna foto"));             
                  }         
              }         
              return 
    rosa;     
            } 

    Questa invece è la struttura del file xml:
    Codice PHP:
    <?xml version="1.0" encoding="UTF-8"?>
    <giocatore nome='Enrico Patrizio'><Ruolo>Estremo</Ruolo><Club>Carrera Petrarca Padova</Club><Presenze>3</Presenze><Punti>0</Punti></giocatore>
    <giocatore nome='Ezio Galon'><Ruolo>Ala</Ruolo><Club>Overmach Cariparma</Club><Presenze>19</Presenze><Punti>5</Punti></giocatore>
    <giocatore nome='Kaine Robertson'><Ruolo>Ala</Ruolo><Club>Arix Viadana</Club><Presenze>30</Presenze><Punti>60</Punti></giocatore>
    <giocatore nome='Alberto Sgarbi'><Ruolo>Ala</Ruolo><Club>Benetton Treviso</Club><Presenze>2</Presenze><Punti>0</Punti></giocatore>
    <giocatore nome='Mirco Bergamasco'><Ruolo>Centro</Ruolo><Club>Stade Français</Club><Presenze>52</Presenze><Punti>75</Punti></giocatore>
    <giocatore nome='Gonzalo Canale'><Ruolo>Centro</Ruolo><Club>Clermont- Auvergne</Club><Presenze>41</Presenze><Punti>30</Punti></giocatore>
    <giocatore nome='Andrea Masi'><Ruolo>Centro</Ruolo><Club>Biarritz Olympique</Club><Presenze>40</Presenze><Punti>50</Punti></giocatore>
    <giocatore nome='Alessio Galante'><Ruolo>Centro</Ruolo><Club>Rolly Gran Parma</Club><Presenze>2</Presenze><Punti>0</Punti></giocatore>

  10. #10
    Risolto

    Allora ho eliminato la classe, creato la variabile di tipo XML all'interno dello stesso stage, dichiarato inline il listener onLoad e messo all'interno dello stesso listener tutte le istruzioni che necessitavano dei dati contenuti nel file xml.

    Posto il codice nel caso in futuro qualcun'altro abbia lo stesso problema:
    Codice PHP:
    var mioxml:XML = new XML(); 
    var 
    rosa:Array = new Array(); 
    mioxml.load("C:/Users/William Lawson/Documents/Università/ppm/Progetto PPM/Contents/xml/Italia.xml"); 
    mioxml.onLoad = function(success){         
         if(
    mioxml.loaded){                 
              
    rosa Dati();                              
              
    trace(rosa.length);             
         } 
    }; 

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.