Newsgroup: it.comp.lang.visual-basic
Titolo: Pausa durante la stampa

se volessi inserire, durante una stampa, uan pausa di 1, 2 o 3 secondi
quale funzione potrei utilizzare?

 quale funzione potrei utilizzare?
Se usi il datareport, puoi gestire l'evento PageCompleted, inserendo una
pausa prima di rilasciare e consentire la stampa della pagina successiva
(credo, in realtà non vorrei che fosse comunque asincrono...)
Ciao
Alberto



No, è un output su LPT1!!!
Voglio fermare la stampa per qualche secondo dopo ogni pagina.

 Voglio fermare la stampa per qualche secondo dopo ogni pagina.
Domanda: come fai l'output su LPT1?
Non è che usi l'oggetto Printer, vero?
Ciao
Alberto



    'Apre la porta per la stampa
    Open "lpt1" For Output As #1
    Print #1, stringa
    Close #1
solo che siccome si trova in un ciclo vorrei interrompere la stampa
dopo ogni loop.
che funzione devo utilizzare?

 che funzione devo utilizzare?
Dim Ora_Inizio as long
Dim Secondi_Pausa as long
Secondi_Pausa=2
Ora_Inizio=Timer
Do While ((timer-ora_inizio)<Secondi_Pausa) and (Timer>Ora_Inizio)
Loop
ciao
Alberto



Grazie!!!

 Loop
Io utilizzereri l'api "sleep".
hth


Funziona, ma č un'API.
Iniziamo il solito dibattito sul perchč si debba cercare di usare le Api
solo quando assolutamente necessario?
ciao
Alberto

 solo quando assolutamente necessario?
In linea di massima posso anche essere d'accordo nel non abusare di funzioni
esterne cercando di sfruttare quello che offre il linguaggio; pero' nel caso
specifico di Sleep considera che:
Non ha controindicazioni di sorta (tipo passare handle/puntatori da gestire
bene per evitare crash).
E' piu' facile e persino piu' leggibile del codice VB nativo (2 istruzioni,
di cui una e' la Declare stessa).
Non consuma risorse CPU come invece il Do..Loop.
Ciao
--
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown

 Non consuma risorse CPU come invece il Do..Loop.
Soprattutto questo! ;-)
hth

 pero' nel caso specifico di Sleep considera che:
Ma sleep non è sincrono ?
Se è cosi', blocca praticamente ogni altro evento.
Invece un do ... while con un doevents all'interno non blocca niente.
Ciao,
        Fabrizio

 ha scritto nel messaggio
news:0sqqgb...@192.168.1.1...

Certo, ma la domanda era come inserire una pausa, non come poter rispondere
ad altri eventi durante un ciclo stretto...
Ad ogni modo, anche volendo usare un ciclo con DoEvents per interrompere
qualche secondo, il sistema migliore in termini di consumo di risorse e'
comunque in accoppiata a Sleep, per esempio:
'Pausa di 3 secondi, con un numero limitato di DoEvents
For i = 1 To 10
    Sleep 300
    DoEvents
Next
piuttosto che un ciclo basato sul timer che potrebbe scatenare centinaia di
chiamate prima di arrivare in fondo.


 chiamate prima di arrivare in fondo.
Per inciso, "centinaia" e' stata una grossolana approssimazione: sul PIV 2.8
Ghz di casa, una pausa di 2 secondi con un ciclo DoWhile genera quasi 2
milioni di iterazioni senza usare DoEvents e circa 800 mila con DoEvents...


 Next
Comunque in quei 300 millisecondi il sistema non risponde ad alcun evento,
perchè sleep è sincrono.
La possibilità comunque che il sistema possa rispondere ad eventi è
fondamentale, anche se 300 millisecondi sembrano una stupidaggine.
Io farei una cosa del genere:
Dim DataCheck as date
DataCheck=dateadd("s",now,3)
do while now<datacheck
        doevents
loop
-- 
Ciao,
        Fabrizio
<=- 
www.negusweb.it
 -=>

 evento, perchè sleep è sincrono.
emm , sicuro ? la descrizione dice : "The Sleep function suspends the
execution of the current thread for a specified interval."
quindi blocca solo il thread del programma che lo ha chiamato lasciando la
CPU agli altri saltando per X tempo il thread chiamante ( o no ? )
-- 
<Gigio2K>
Sito Comune
Nokia -> I.T.H.N. -> 
http://www.ithn.it/
VB -> I.C.L.VB -> 
http://www.it-lang-vb.net/

 loop
Questo e' una variante di quello gia' visto con la funzione Timer e
certamente funziona, pero' come facevo notare nell'altro messaggio "macina"
una quantita' notevole di iterazioni che fanno schizzare al 100% o giu' di
li' l'occupazione della CPU


 loro strada...
Se è riferito solo al thread corrente, allora si


 rallenta, tutto il resto del sistema.
Come si fa, pero', se nel programma c'e' la necessità di catturare eventi
(tastiera, seriale, ecc.) ?
Il fatto che lo sleep sia sincrono fa perdere queste informazioni, o
sbaglio?
Ovviamente parlo all'interno di uno stesso programma.


 Ovviamente parlo all'interno di uno stesso programma.
Hmmmmm... capisco che e' tardi, ma mi pare che siamo entrati noi, non il
programma, in loop.
Hai gia' fatto questa osservazione due messaggi prima, e la cosa mi pareva
fosse gia' stata chiarita: copio & incollo dalla risposta del 06/08
"[...] la domanda era come inserire una pausa, non come poter rispondere
ad altri eventi durante un ciclo stretto...
Ad ogni modo, anche volendo usare un ciclo con DoEvents per interrompere
qualche secondo, il sistema migliore in termini di consumo di risorse e'
comunque in accoppiata a Sleep [seguiva esempio]"


 ad altri eventi durante un ciclo stretto...
Il discorso si era evoluto.
Quindi, usando sleep eventuali eventi da catturare si perderebbero ?


 Il discorso si era evoluto.
Affatto. L'unico malinteso che restava era quello del thread corrente, ma
tutto il discorso, guarda bene, era stato sviscerato anche prima... a questo
punto copio & incollo per intero la risposta del 06/08, sperando sia piu'
chiaro:
Domandavi:
"
Ma sleep non è sincrono ?
Se è cosi', blocca praticamente ogni altro evento.
Invece un do ... while con un doevents all'interno non blocca niente.
"
Risposta:
"
Certo [NdA: riferito all'essere bloccante], ma la domanda era come inserire
una pausa, non come poter rispondere ad altri eventi durante un ciclo
stretto...
Ad ogni modo, anche volendo usare un ciclo con DoEvents [NdA: e quindi
rispondere ad eventi] per interrompere qualche secondo, il sistema migliore
in termini di consumo di risorse e' comunque in accoppiata a Sleep, per
esempio:
'Pausa di 3 secondi, con un numero limitato di DoEvents
For i = 1 To 10
    Sleep 300
    DoEvents
Next
"
Questo, se non si fosse capito, era l'esempio per avere la botte piena e la
moglie ubriaca: una pausa lunga ma con pochi DoEvents che spremono la CPU
il punto e' che Sleep "addormenta" il thread ma non cancella i
messaggi(=eventi) in coda, a meno di non usare un intervallo cosi' lungo da
scatenare il famigerato 'non risponde' di Windows. Quindi se in quel periodo
si verifica qualcosa, viene semplicemente processato con un ritardo...
quanto breve lo decidi spezzando in piu' o meno blocchi la pausa
complessiva, come nel ciclo qui sopra
Un meccanismo di questo tipo lo uso nel mio motore di scacchi per fare,
durante tutta la durata dell'applicazione, anche ore intere, un polling
sullo standard input: pur usando uno sleep piu' breve (100 ms) e quindi piu'
responsivo, la percentuale di occupazione della CPU e' un ventesimo di
quella con Do: DoEvents: Loop e basta.
