Newsgroup: it.comp.lang.visual-basic
Titolo: Impostare tempi di attesa

Potete aiutarmi a capire il perchè questo codice non funziona come vorrei?
Option Explicit
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Sub Command1_Click()
  Text1.Text = "a"
  Call Sleep(2000)
  Text1.Text = "b"
End Sub
Al click su command1 deve apparire la lettera "a" sul text, dopo 2 secondi
deve apparire la lettera "b"; invece al clic sul command non succede nulla
inizialmente, poi dopo 2 secondi in effetti viene visualizzata la lettera
"b": perchè la "a" non si vede all'inizio?
Senbra che ovunque metta l'istruzione call Sleep(2000) venga eseguita
comunque all'inizio della routine, a me invece serve interrompere al
centro... ossia prima far succedere delle cose, poi interrompere per due
secondi, poi far succedere altre cose...
Qualcuno può aiutarmi?
Grazie infinite!

 End Sub
Ciao!
--
Esteban
Hosted by 
www.seber.it
(Remove nonspammare for reply)

Finchè una sub non termina il sistema non esegue altri eventi di
interazione, quindi se non forzi il refresh, o addirittura non forzi un
DoEvents, la modifica allo schermo non può avvenire.
Ciao
Alberto

"b": perchè la "a" non si vede all'inizio?
[ cut ]
devi mettere un refresh della TextBox prima della chiamata
alla Sleep.
Ciao
 Valter

 secondi, poi far succedere altre cose...
[SNIP]
Non e' un problema di "inizio" oppure "centro" della routine; la sequenza
delle istruzioni si e' svolta esattamente come vuoi tu ma devi tenere conto
di un'altro aspetto:
quando effettui una modifica che influenza l'interfaccia utente, perche'
questa sia visibile il sistema operativo deve ridisegnare la finestra
("finestra" in senso lato; anche i singoli controlli sotto windows vengono
considerati finestre)
E' un processo automatico, ma esistono situazioni in cui operazioni piu'
pesanti hanno la precedenza sul ciclo di sistema che si occupa di questa
cosa, nel tuo caso Sleep() e' un'operazione tutt'altro che pesante, solo che
segnala al S.O. di non fare nulla, e in quel nulla e' compreso anche il
refresh della tua finestra.
Ottieni quindi esattamente lo stesso comportamento; prima che ci sia il
tempo di ridisegnare a video la tua lettera "a" (che per inciso e'
un'operazione moderatamente pesante), viene eseguita l'istruzione successiva
e cosi' via.
In questi casi puoi pero' forzare un refresh della tua interfaccia, in modo
da ottenere un effetto piu' gradevole, sostanzialmente in 3 modi:
Text1.Text = "a"
Text1.Refresh
'il piu' leggero: viene ridisegnato solo il controllo indicato
Text1.Text = "a"
Me.Refresh
'la via di mezzo: viene ridisegnata l'intera finestra
Text1.Text = "a"
DoEvents
'il piu' pesante: viene dato modo al sistema di processari i messaggi
'rimasti in coda; non necessariamente relativi alle funzioni di disegno
'e nemmeno solo al tuo programma
'Per questo motivo DoEvents deve essere usato con cognizione di causa,
'spesso e' indispensabile per poter dare la possibilita' all'utente di
'interrompere a meta' un ciclo di qualche tipo, ma usato a sproposito
'puo' dare risultati imprevedibili
Nota che la seconda modifica a Text1 non necessita di alcun refresh, proprio
perche' non e' seguita da nessuna operazione lunga o bloccante, e quindi
viene gestita normalmente.
Ciao
--
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown

 'rimasti in coda
Una piccola precisazione: DoEvent e' *potenzialmente* piu' pesante del
refresh della finestra, perche' risente maggiormente dell'attivita' esterna
al programma e quindi il S.O. potrebbe concedere meno CPU
In questo esempio specifico, se non c'e' nessun processo particolare in
esecuzione, allora potrebbe rivelarsi poco piu' lento di Text1.Refresh, in
quanto tra i messaggi impliciti in coda c'e' sicuramente il ridisegno del
TextBox, ma non quello della finestra intera...


 ha scritto nel messaggio
news:a8f5nm$2v5$1...@lacerta.tiscalinet.it...
