[Php-it] [JS] simulare lo sleep.

simo fsockopen at yahoo.it
Fri Dec 29 10:36:14 CET 2006


Vorrei provare a dare una mia interpretazione alla
cosa (visto che c' ho gia' battuto diverse capocciate)

--- Davide Michel 'ZioBudda' Morelli
<michel a ziobudda.net> ha scritto:


> Emiliano Gabrielli (aka AlberT) ha scritto:
> > ?? non vedo questa associazione di idee
> sinceramente ...
> >
> > se ha setTimeout vuol dire solo che può impostare
> un timeout (in modo 
> > asincrono)
> >   

ESATTO !!!

Il problema e' che non devi usare il *while()*

php-gtk1 ha lo stesso problema e si risolve con

$tid =
gtk::timeout_add(1000,'miafunzione','param1',...)

che corrisponde a setTimeout di js

es.
function DoSomething()
{
    global $UI, $tid;
    // Crea una progressbar 
    $UI['ProgressBar'] = &new gktProgressBar()  
$tid =
gtk::timeout_add(1000,'miafunzione','param1',...);
}

function miafunzione($param)
{
    // fai una cosa
    // Avanza con la progressbar
    /* dopo aver fatto i cavoli tuoi restituisci il
controllo all' interfaccia che viene aggiornrta con i
nuovi valori e che dopo 1000 msec richiama
miafunzione().
    In questo modo dai la possibilita' all'
interfaccia di trapparsi altri eventi (es. il click
sul bottone annulla).
    se ritorni true viene creato un nuovo tid
(thread_id) se ritorni false non viene piu' creato.
    altrimenti puoi stoppare il/i thread con
    gtk::timeout_remove($GLOBALS['tid']);

    nello stesso modo potresti creare un nuovo tid
all' interno di questa funzione che richiama la stessa
in modo ricorsivo dopo un intervallo ed uscire dal
ciclo semplicemente *NON creando piu' alcun thread*.

    es.
   
gtk::timeout_add(1000,__FUNCTION__,func_get_args());

    */
    return $continua?true:false;
}

con lo stesso principio funziona in JS con l' unica
differenza che con IE c'e' un hack da fare:
http://www.hedgerwow.com/360/dhtml/js-setInterval-fix.html


questo articolo chiarisce la differenza tra un loop
con pausa completa o con restituzione del controllo
all' interfaccia.
http://www.faqts.com/knowledge_base/view.phtml/aid/1602

Come diceva chi ha iniziato il thread:
    /*
    * This function will not return until (at least)
    * the specified number of milliseconds have
passed.
    * It does a busy-wait loop.
    */
    function pause(numberMillis) {
        var now = new Date();
        var exitTime = now.getTime() + numberMillis;
        while (true) {
            now = new Date();
            if (now.getTime() > exitTime)
                return;
        }
    }

/* NON STO A TRADURRE */
A sneaky way to get the effect of a true pause while
not
burning CPU cycles is to use a modal dialog with a
timeout that closes
the modal dialog window and resumes execution.  A
modal dialog pauses
execution in the code that created it, but allows
other threads to
continue. 


    /*
    * This function will not return until (at least)
    * the specified number of milliseconds have
passed.
    * It uses a modal dialog.
    */
     function pause(numberMillis) {
        var dialogScript = 
           'window.setTimeout(' +
           ' function () { window.close(); }, ' +
numberMillis + ');';
        var result = 
// For IE5.
         window.showModalDialog(
           'javascript:document.writeln(' +
            '"<script>' + dialogScript + '<' +
'/script>")');

/* For NN6, but it requires a trusted script.
         openDialog(
           'javascript:document.writeln(' +
            '"<script>' + dialogScript + '<' +
'/script>"',
           'pauseDialog',
'modal=1,width=10,height=10');
 */
     }




Ciao

Simone



__________________________________________________
Do You Yahoo!?
Poco spazio e tanto spam? Yahoo! Mail ti protegge dallo spam e ti da tanto spazio gratuito per i tuoi file e i messaggi 
http://mail.yahoo.it 


More information about the Php-it mailing list