Newsgroup: it.comp.lang.perl
Titolo: sleep()

Ciao a tutti
sto scrivendo un prg che verifica, confrontando un archivio, se ci sono
ricorrenze da festeggiare.
siccome parte in auto all'avvio del pc, ho necessita' che l'utente possa
effettuare una scelta (esempio verifica di una certa data) ma che, trascorsi
15 secondi, se la scelta non viene effettuata, il programma termini.
ho tentato sia con sleep() che con un ciclo while() ma non ci sono riuscito
:-(
infatti il prg comunque attende sempre l'invio della <stdin>
grazie a tutti per l'aiuto e ciao

 ho tentato sia con sleep() che con un ciclo while() ma non ci sono
riuscito
Ciao,
ho fatto cosě e funziona :)
$start=time();
print "inizio ciclo<br><br>\n";
while ($now < $start+5){
    $now=time();
}
print "fine ciclo<br>\n";
           Anak
anakt...@libero.it

 print "fine ciclo<br>\n";
sleep(5) faceva proprio schifo?
-- 
Saluti,
Giancarlo

 sleep(5) faceva proprio schifo?
Certo che no :) Però l'ho provato e non funzionava bene... ovvero avendo un
output html e inserendo lo sleep(n) accadeva che l'output venisse emesso
tutto alla fine dello sleep.
Ad es.
print<<HTML;
    stampo prima dello sleep
HTML
sleep(5);
print<<HTML:
    stampo dopo lo sleep
HTML
L'output sul browser avviene tutto alla fine dell'intervallo... Preferisco
il while con la differenza sui time() :)
A presto
          Anak
anakt...@libero.it

il while con la differenza sui time() :)
Perche' stdout e` "bufferato". Prova a mettere un:
  $| = 1;
o un:
 
   autoflush stdout;
all'inizio.  
Ciao.

 tutto alla fine dello sleep.
Eeehhh ?????
Quello di cui stai parlando io so che si chiama "Server Push", e per far si'
che funzioni so che innanzitutto il browser dev'essere disposto ad accettare
il content-type: multipart/mixed
poi ci vuole un boundary per ogni output e infine il nome dello script deve
avere il prefisso "nph-".
Mi pare troppo strano che ti funzioni senza tutto questo macello di cui
sopra (?!?)...
Perchè non la dici tutta?
Ciao,
Guido.

 Perchè non la dici tutta?
Ciao Guido, da come hai quotato non riesco a capire se rispondi a me oppure
a Bisso. Se la risposta era per me posso mettere online il piccolo script
con tanto di codice sorgente per mostrarti che lo sleep(5) si comporta (per
come l'ho implementato) esattamente come descritto (motivo per cui ho
utilizzato il ciclo while con la differenza di due time()).
A presto
           Anak
anakt...@libero.it

 venisse emesso tutto alla fine dello sleep.
Gurada che anche col tuo metodo in un cgi ottieni lo stesso risultato.
Il problema e', come ti dicevano, legato alla bufferizzazione 
dell'output, inoltre penso che alcuni navigatori visualizzino l'html 
solo a "Trasferimento completato".
comunque fai come credi, contento tu....
-- 
Saluti,
Giancarlo

"Giancarlo Bisso" ha scritto nel messaggio
news:agm7u1$2o2q$1...@stargate1.inet.it...

Ciao Giancarlo, non è che con il "mio" metodo sono contento... inoltre con
il ciclo while non è vero che ho l'output arriva a "trasferimento
completato". Di certo non riesco a far funzionare correttamente sleep()  :)
Ad ogni modo e per evitare equivoci ho messo online due script:
212.239.39.210/cgi-bin/sleep.cgi
 (che usa sleep e fornisce l'output solo
alla fine) e
212.239.39.210/cgi-bin/test.cgi
 (che usa un while e fornisce un output
"corretto") i cui sorgenti riporto qui sotto:
- sleep.cgi
print "Content-type: text/html\n\n";
print<<HTML;
 <br>
     Inizio pausa di 5 sec
 <br>
HTML
print "\n";
sleep(5);
print "\n";
print<<HTML;
 <br>
 Fine pausa di 5 sec
 <br>
HTML
exit;
- test.cgi
$start=time();
print "inizio ciclo - pausa di 5 sec<br><br>\n";
while ($now < $start+5){
    $now=time();
   print "\n";
}
print "fine ciclo<br>\n";
exit;
A presto :)
          Anak
anakt...@libero.it

 print "fine ciclo<br>\n";
Sei testardo!!!!!
Il probrema e' l'output bufferizzato e/o il browser!!!!!
Allora:
- bufferizzazione
col tuo while forzi il flush con la tonnellata di \n che mandi, 
prova cosi':
$|=1;
print "inizio ciclo<br>";
sleep(5);
print "fine ciclo<br>";
- broswer
Mozilla visualizza l'html che ariva un po' alla volta (cioe' c'e' 
differenza tra i tuoi 2 script)
Konqueror invece visualizza tutto alla fine (ovvero non c'e' differenza 
tra gli script)
Come si conporti Explorer non lo so.
Mi resta comunque oscuro il motivo per cui dovrei far aspettare 
qualcuno per fagli leggere dell'html....
-- 
Saluti,
Giancarlo

 qualcuno per fagli leggere dell'html....
I motivi non sono oscuri, dipende da quello che devi fare. A me occorreva un
sistema per far vedere al cliente, momento per momento, l'invio di mail
dalla cgi della newsletter.
Ripeto, non sono contrario allo sleep(). E' evidente che non riesco a farlo
funzionare e sono costretto ad usare un while... però di soluzioni
"funzionanti" con sleep() non ne ho ancora viste.
A presto
            Anak
 
anakt...@libero.it

 soluzioni "funzionanti" con sleep() non ne ho ancora viste.
Ok, continua a mandare fuori circa 45.000 \n per ogni pausa di 5 
secondi, contento tu.. la banda non la pago certo io....
-- 
Saluti,
Giancarlo

 secondi, contento tu.. la banda non la pago certo io....
Per carità, di certo il while ha dei problemi... però vedi che lo sleep()
così come lo hai usato tu, non dà il risultato cercato e cioè: output,
pausa, output. Dato che il tuo metodo non funziona, non capisco per quale
motivo continui a postare sul thread. Si è capito solo che sei contrario ad
un while ma non hai fornito alternative funzionanti.
           Anak
anakt...@libero.it

Anak wrote:

Hai fatto un corso di "Sviluppa le tue capacita' nella risoluzione dei 
problemi"?
1. Se io visualizzo 
http://212.239.39.210/cgi-bin/new.cgi
 con mozzilla 
vedo l'output arrivare in 2 tempi diversi, quindi l'affermazione "Dato 
che il tuo metodo non funziona" e' del tutto opinabile, come tutto sul 
web visto che e' sempre e comunque mediato da un browser che visualizza 
cio' che vuole. (Forse non lo sa ma il perl funziona anche fuori dal 
mondo cgi e forse n questo modo riesci a capire meglio il funzionamento 
di uno script....)
2. Non sono contrario a nulla... ma le soluzioni illogiche mi fanno 
schifo, tutto qui.
3. Usi una cosa che (parole tue) "ha dei problemi", allora cerca di 
risolvere i problemi, cerca di capire perche lo sleep non funziona (io 
un'altra idea l'avrei.... su come modificare il mio esempio, ma sta 
volta non te la dico, se vuoi sbattiti da solo) invece di crogiolardi 
in una soluzioni brutta e inelegante.
-- 
Saluti,
Giancarlo

 un'altra idea l'avrei.... su come modificare il mio esempio
[cut]
Bene, perchč cosě come lo hai postato non va bene.
A presto
          Anak
anakt...@libero.it

Bene, perchč cosě come lo hai postato non va bene.
Veramente a me qui funziona benissimo. Lancio il mio 'perl 
sleep.pl
' e lui
stampa la prima riga, fa la pausa di 5 secondi e stampa l'ultima. E cosi` mi
attendo che faccia su qualunque sistema perl, perche' cosi` e` previsto che
si comporti nelle specifiche del linguaggio.
Che non dia i risultati sperati nel contesto di un certo server http che lo
esegue come cgi e di un certo browser che ne riceve l'output, dipende da
cose che nulla hanno a che vedere con perl in generale e con sleep in
particolare, e che inviterei a investigare nel loro specifico.
A tal fine, ricordo che esiste it.comp.www.cgi in cui e` liberamente
possibile andare a farsi ridere dietro.
Per quel poco che so e capisco io, questa cosa della pagina html in due
tempi proprio non e` prevista: se e quando funziona, funziona per caso.
Io suggerirei piuttosto il ricorso ad un qualche script presso il client
(non e` piu` peccato, e` uscita un'enciclica al proposito, mi pare), che
richiami un'altra pagina dopo un tot.
Avresti cosi' almeno la certezza di una cosa che funziona cosi` perche' deve
funzionare cosi`, non per un concorso irripetibile di eventi che si puo`
interrompere all'uscita della prossima versione di Internet Explorer, o del
server http, o al cambio della fase lunare.
Ciao.

>Bene, perchè così come lo hai postato non va bene.

Sante parole, forse sono stato criptico e brusco, ma era proprio questo 
il concetto che volevo esprimere. 
Spero che con questa spiegazione piu' estesa e chiara diventi piu' 
chiaro.
-- 
Saluti,
Giancarlo

 server http, o al cambio della fase lunare.
Vedi, il bello della tecnica CGI è che l'elaborazione avviene sul server
sempre allo stesso modo (può variare solo tra server e server), quindi che
esca un nuovo browser rende indifferente l'elaborazione dello script (lato
server != lato remoto).
Infine... leggo ora (purtroppo) il manifesto del gruppo. Non si deve parlare
di CGI se non in OT. Sarebbe stato forse opportuno farlo notare a chi ha
aperto il thread oltre che a me
A presto
           Anak
anakt...@libero.it

 stesso modo.
Non sta parlando dell'interprete, ma del modo in cui il server esegue 
lo script, del modo con cui manda l'output al client, del modo in cui 
il client riceve questo output e di come lo visualizza.
Il perl il lavoro di fermarsi 5 secondi lo fa, che poi il tuo browser 
non lo visualizzi e' tutto un altro problema.
Prova un po' a vedere l'output con un telent alla porta 80... e dando 
dei 
GET /cgi-bin/[sleep|new|test].cgi HTTP/1.1
cosi' vedi le reali differenze, senza la mediazione di un browser e 
vedi come la visualizzazione dell'html e' abbastanza "casuale" e non e' 
detto che dipenda da "come" il testo gli arrivi dal server.
-- 
Saluti,
Giancarlo

 GET /cgi-bin/[sleep|new|test].cgi HTTP/1.1
Ho fatto l'esperimento... purtroppo il client non visualizza il codice di
output. Ammettendo che lo sleep in questo caso funzioni non posso certo
pretendere che gli utenti se ne vadano in giro con telnet....
In conclusione, la soluzione "lato client" è da scartare perchè insicura
(domani cambia il browser e non funziona piu niente), idem quella con
sleep() (solo limitatamente ad una CGI). Rimane (imho) da valutare meglio il
ciclo while (cmq buttato giu in fretta e solo come suggerimento a chi ha
aperto il thread - a proposito dove sei???).
A presto
          Anak
anakt...@libero.it

(domani cambia il browser e non funziona piu niente),
BALLE!! E` proprio quella piu` sicura, fra quelle di cui si e` parlato (puo`
darsi che altre ne esistano, ma e` anche probabile che non siano cosi`
facilmente accessibili e semplici), perche' si basa su un linguaggio che
deve fare quello che dice di fare, e che ha avuto e avra` una vita piu`
lunga di questa o quella versione di browser.
Che ci siano delle differenze di implementazione e` un conto, che queste
impediscano di fare alcunche' e` un altro. E` possibile contare su un
sottinsieme di JavaScript ragionevolmente stabile e condiviso che
permetterebbe, quanto meno, di fare la semplice cosa che dici. E la tendenza
mi pare che sia verso un'estensione di tale insieme, non verso una
riduzione.
Ciao.

server != lato remoto).
EDDAGLI! IL BROWSER PUO` FARE QUELLO CHE GLI PARE, NON E` OBBLIGATO A
VISUALIZZARE LA PAGINA MENTRE GLI ARRIVA! L'unita` logica minima e` la
pagina, non una riga o che altro; e l'unita` fisica minima e` ancora
un'altra cosa, che il tuo script non puo` controllare.
Hai VISTO che diversi browser si comportano diversamente, come fai a dire
che "non c'entra il browser"?
Ciao.

Allora, permettetemi di intervenire e ribadire un concetto già
precedentemente da me espresso.
Per far sì che un CGI invii al browser informazioni "temporizzate" senza che
il browser le visualizzi tutte insieme al termine del caricamento della
pagina web, ci sono SOLO DUE metodi conosciuti: "Client Pull" e "Server
Push". Come suggeriscono i nomi, il primo prevede un refresh continuato
della pagina con richiesta dal lato del client. Esempio:
<meta http-equiv='refresh' content='5;url=/cgi-bin/
script.pl
'>
La pagina si aggiorna ogni 5 secondi.
Il secondo, piu' complesso ma piu' completo, prevede un aggiornamento della
pagina da parte del CGI che invia dati al client e che vengono visualizzati
man mano che questo li riceve, senza dover ricaricare la pagina. In tal caso
poi ci sono 2 modi di visualizzazione: sostituzione del contenuto oppure
accodamento.
La chiave del funzionamento del Server Push sta nella gestione degli header
HTTP. L'unico suo è che non tutti i browser sono compatibili.
Oltre non vado, ma invito Anak e chiunque sia interessato a fare una ricerca
su Google sull'argomento "Server Push", o anche visualizzare la pagina man
del modulo CGI.
Aggiungo solo un'ultima cosa: per far si' che uno script eseguito dalla
'cgi-bin' spari header non standard, c'è bisogno che il suo nome inizi con
il prefisso "nph-" (Not parsed header), e il server non controllerà
l'esattezza (o la presenza) degli header http.
La soluzione di Anak funziona, è vero, ma non è ottimale, potrebbe mandare
in crash il webserver con niente.
Ciao,
Guido.

l'opinione non si discute.
Semplicemente, fa parte del gioco. Francamente, se dico o faccio una boiata,
preferisco incontrare qualcuno che, sapendone piu` di me, mi ride dietro (o,
meglio ancora, apertamente in faccia), permettendomi di imparare e
correggermi, piuttosto che tanti riguardosi ignoranti come me, che mi
propongono le loro rispettose e rispettabili opinioni.
A parte questo, oh, che ti devo dire? a me:
   inizio ciclo - pausa di 5 sec<br><br>
   "\n" x 20444
   fine ciclo<br>
mi fa scappar da ridere. S'intende, ognuno ha il proprio senso del ridicolo.
Ciao.

 in crash il webserver con niente.
Ciao Guido, grazie del consiglio...nel frattempo spero che il mio webserver
non si incastri ;)
           Anak
anakt...@libero.it