Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    Prendere in giro il player (quando i dati sono troppi)

    Salve, visto l'insuccesso dello scorso quesito (che dovrei aver risolto scrivendo più codice per distruggere e controllare piuttosto che che per creare) ne pongo un altro.

    Situazione:
    carico dei dati dal server, sono tanti ... cioè non tantissimi ma abbastanza da creare problemi al player.

    trattasi di un paio di migliaia di contatti, caricati in LoadVars e suddivisi, per ogni contatto, in circa una decina di informazioni.

    L'operazione di parsing, tramite il benchmark da me effettuato, dura circa 1 secondo sul mio Centrino 1.6, sicuramente non l'ultimo e veloce processore ma per me ancora buono.

    Il ciclo che impegna la CPU è fatto così

    codice:
    // codice all'interno di un onLoad
    var a:Number = 0;
    while(this["info" + a]) {
    	// parsa ed assegna valori
    	++a; // ++a va più veloce di a++ su loop "consistenti"
    }
    il codice è semplice, funziona alla perfezione ma su un PC non molto potente (un Mac non recente, un Pentium 3 e probabilmente altri) fa scattare "l'allarme" al player con una finestra di dialogo che dice:

    "Questo movie sta effettuando un loop infinito, fermare le operazioni ?"


    Dopo aver dato sfogo a tutte le mie risorse per ottimizzare e velocizzare il parsing, senza ottenere risultati differenti, mi è venuta in mente una cosa "stupida", ovvero prendere in giro il Flash Player.

    Come ? Semplicemente switchando da while a for il loop, sapendo che più di 5.000 risultati non potranno esserci (l'idea era questa: "ora non può pensare che sia un loop infinito").

    codice:
    for(var a:Number = 0; a < 5000; a++) {
    	if(this["info" + a]) {
    		// parsa ed assegna valori
    	}
    	else
    		a = 5000; // termina il loop
    }
    Ora, sebbene sembra che il problema sia risolto, scopo sempre primario, questa soluzione non mi sembra ne troppo coerente ne troppo pulita e soprattutto non mi sembra portabile o scalabile.

    Qualcuno di voi sa se esiste un modo per dire al player che si è certi che il loop while non è infinito o conosce un modo scalabile per affrontare la questione ?


    Grazie


    [edit]
    operazioni tentate prima del for:
    1 - usare array e join per concatenare le stringhe (in JS è più veloce, in AS nemmeno tanto)
    2 - usare proprietà predefinite in un array per evitare di riconcatenare ogni parametro
    3 - usare una funzione "a steps", ovvero in grado di fare il while ed uscire di 100 in 100, o 500 in 500
    4 - mettere su caffè, fumare 12 sigarette, pulire il fornello dal caffè strabordato, bruciato e bollito
    5 - altro ancora ...
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  2. #2
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    a primo acchitto ti avrei subito suggerito questo

    3 - usare una funzione "a steps", ovvero in grado di fare il while ed uscire di 100 in 100, o 500 in 500

    ma in effetti dubitavo del fatto che non l'avessi già pensato


    però dimmi una cosa, la funzione "a steps" che hai creato gestisce più while senza lasciare un tempo di scarto tra uno e l'altro?

  3. #3
    Originariamente inviato da and80
    dimmi una cosa, la funzione "a steps" che hai creato gestisce più while senza lasciare un tempo di scarto tra uno e l'altro?
    siccome l'errore lo scaturisce il ciclo while, la funzione altro non fa che spezzettare questo loop.


    codice:
    function loop(l:LoadVars, a:Number):Void {
    	var b:Number = a + 100;
    	while(a < b && l["info" + a]) {
    		// operazioni parsing
    		++a;
    	}
    	if(a === b) // significa che c'è ancora da parsare
    		loop(l, a);
    }
    ... niente di più semplice .... solo che non risolve il problema perchè di fatto, appoggiandosi ad una ricorsione, si corre lostesso il rischio di un loop infinito.


    Il bello è che se si dice al player di non bloccare il codice, questo viene eseguito perfettamente e tutto va che è una bellezza.

    Solo che non posso scrivere "se il player vi da errore non preoccupatevi" .... quindi ho dovuto ripiegare per forza sul for(; ... che mi hanno confermato non dia più il problema anche su catorci Mac vecchi e schifosi


    Non cerco una soluzione (l'ho già trovata), cerco una risposta alla domanda "c'è un modo per non avere mai problemi ???"

    Grazie per eventuali suggerimenti o consigli
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  4. #4
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    io pensavo ad una cosa del genere...

    potresti continuare a spezzettare il codice come hai fatto ma dando un piccolo intervallo tra un richiamo e l'altro nel loop, tipo

    - esegui da 0 a 99
    - fermati per 1/100 di secondo
    - esegui da 100 a 199
    - e così via

    in questo modo i tempi di richiesta/risposta dovrebbero spalmarsi in un tot di tempo, dando al player l'impressione di eseguire più azioni non concatenate, non sò quanto possa andare nella realtà ma l'idea era questa

  5. #5
    stai parlando di intervalli ? :master:
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  6. #6
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    Originariamente inviato da andr3a
    stai parlando di intervalli ? :master:
    sì... questo è quello che avrei fatto io, non è detto che sia corretto perchè non l'ho neanche provato...

    altrimenti sulla base del tuo "aggiustamento" ci sarebbe un'altra possibilità, un doppio richiamo al PHP con LoadVars, uno solo per ottenere il numero di record da processare, velocissima, già lo sai... e l'altra, quella che già fai... e nel ciclo FOR come limite inserisci il numero ricevuto dalla prima chiamata, così non hai mai problemi anche se il ciclo sfora i 5000

  7. #7
    Utente di HTML.it L'avatar di freetom
    Registrato dal
    Nov 2001
    Messaggi
    3,725

    mi interessa molto l'argomento... :)

    In particolare.. avrei questo cod da ottimizzare con questa la vostra dritta per evitare il blocco del flashplayer per tempi lunghi:

    on (release) {

    _root.avviso.avvisotxt="loading data...";
    _root.avviso._visible=true;

    for(var a = 0; a < 10000; a++) {

    if (_root.campo.text=="") {

    trace ("ancora carico..");

    }
    else {
    a = 10000;
    }


    percorso="miourl";
    var invia = new LoadVars();

    for (i = 0; i < MouseMov.length; i++) {

    _root.campo.text += dati;

    }


    if(_root.campo.text!=undefined || _root.campo.text!="") {
    invia.variabili = _root.campo.text;
    invia.descrizione = _root.descrizione.text;
    var ricevuto = new LoadVars();

    invia.sendAndLoad(percorso+"creafilemancanteg.php" ,ricevuto);
    ricevuto.onLoad = function(success) {
    if(success) {
    trace("OK");

    _root.avviso.avvisotxt="OK";
    _root.avviso._visible=true;
    //trace(ricevuto);
    }
    }


    }


    azzeravotazione();

    }

    Nonostante il valore di a molto alto 10.000 la finestra di alert del flashplayer mi appare lo stesso... Dove posizionereste il vostro cod per "ingannare" per il tempo il flashplayer
    all'interno del cod soprastante?

    GRAZIE infinite



  8. #8
    Utente di HTML.it L'avatar di nep036
    Registrato dal
    Nov 2003
    Messaggi
    1,453

    Re: mi interessa molto l'argomento... :)

    Originariamente inviato da freetom
    In particolare.. avrei questo cod da ottimizzare con questa la vostra dritta per evitare il blocco del flashplayer per tempi lunghi:

    on (release) {

    _root.avviso.avvisotxt="loading data...";
    _root.avviso._visible=true;

    for(var a = 0; a < 10000; a++) {

    if (_root.campo.text=="") {

    trace ("ancora carico..");

    }
    else {
    a = 10000;
    }


    percorso="miourl";
    var invia = new LoadVars();

    for (i = 0; i < MouseMov.length; i++) {

    _root.campo.text += dati;

    }


    if(_root.campo.text!=undefined || _root.campo.text!="") {
    invia.variabili = _root.campo.text;
    invia.descrizione = _root.descrizione.text;
    var ricevuto = new LoadVars();

    invia.sendAndLoad(percorso+"creafilemancanteg.php" ,ricevuto);
    ricevuto.onLoad = function(success) {
    if(success) {
    trace("OK");

    _root.avviso.avvisotxt="OK";
    _root.avviso._visible=true;
    //trace(ricevuto);
    }
    }


    }


    azzeravotazione();

    }

    Nonostante il valore di a molto alto 10.000 la finestra di alert del flashplayer mi appare lo stesso... Dove posizionereste il vostro cod per "ingannare" per il tempo il flashplayer
    all'interno del cod soprastante?

    GRAZIE infinite


    Devi usare un interval e non un ciclo....come ti ho detto nell'altro 3d

  9. #9
    Utente di HTML.it L'avatar di nep036
    Registrato dal
    Nov 2003
    Messaggi
    1,453
    Poi scusa ma se non si verifica l'if tu fai ripartire il ciclo....allora spiegami a che ti serve 10.000, metti 10.... il risultato è lo stesso nel tuo caso...

  10. #10
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    se c'è già un thread aperto con lo stesso quesito, elimino i nuovi interventi, visto che comunque il thread risale ad un anno fa

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.