Newsgroup: it.comp.lang.visual-basic
Titolo: DoEvents

C'è qualcuno che mi spiegherebbe esattamente cosa fa e a cosa serve il
comando DoEvants?
Grazie
CoDaBat

 comando DoEvants?
Come sai il processore non č in grado di eseguire piů processi
contemporaneamente, perciň durante il funzionamento di Windows ogni
programma invia comandi al processore ma questi vengono eseguiti uno alla
volta creando cosě una coda di processi che cercano di arrivare al
processore (mi sto incartando :)
Supponi ora che uno di questi processi si sia impossessato del
microprocessore lasciando gli altri in attesa (un esempio tipico č un loop
molto lungo), come fare per far eseguire al processore il resto della coda
evitando che il sistema si blocchi? DoEvents....
Vado di fretta, se non ti č chiaro te lo scrivo meglio
ciao, Alf

"Alf" <a@a.a> ha scritto nel messaggio news:3cc9a...@news.dada.it...

Ti ringrazio,
beh da un punto concettuale adesso mi č piů chiaro. Se hai volgia ti
ringrazio se puoi approfondirmi la questione, magari con qualche piccolo
esempio pratico.
Infinitamente grazie.
CoDaBat

 Infinitamente grazie.
se posso mi intrometto io ^_^
come spiegato sopra il DoEvent lo uso molto quando ci sono cicli lunghi .
Mettiamo che hai un programma che esegue un ciclo ( for next .. do
loop...ecc.. )
ok , adesso diciamo che questo ciclo in secondoi duri 15 secondi , il
processore per 15 secondi sarebbe solo sulla tua applicazione e quindi
diciamo che non e' bello ^_^;
for i = 1 to 1000
 'serie di comandi "lunghi"  che ciucciano il processore
 ....
 ....
  'con il doevent permetti al processore di eseguire altri comandi
  'di altre applicazioni e poi riprendere la tua
 DoEvent
next i
Tutto qui !

 processore (mi sto incartando :)
in linea di principio è ok, solo che non è del tutto esatto quanto da te
detto;
la definzione corretta è che ogni finestra windows reagisce ad una serie di
messaggi che windows stesso genera in seguito a determinate operazioni
dell'operatore o a determinati eventi del sistema;
questi messaggi vengono poi letti da vb e trasformati in chiamate a
procedure di evento: ad es. i messaggi di movimento mouse genereranno delle
chiamate a degli eventi di tipo _MouseMove e così via;
ogni volta che windows deve inviare un messaggio ad una finestra, inserisce
questo messaggio in una opportuna coda di messaggi; come conseguenza di ciò,
ogni messaggio può venire letto se e solo se il messaggio precedente è già
stato elaborato;
infatti, se ad esempio in una form, come conseguenza di un click su un
command button, proviamo ad inserire un ciclo for che duri alcuni secondi,
possiamo notare che durante l'esecuzione di questo ciclo la nostra finestra
sembra non considerare eventuali ulteriori click su altri pulsanti; alla
fine di tale elaborazione però, la nostra applicazione elaborerà in rapida
successione tutti i click che avevamo effettuato in precedenza;
questo perchè nonostante la nostra applicazione non fosse in grado di
elabore i messaggi relativi ai click effettuati, tali messaggi sono stati
comunque inseriti nella coda di elaborazione opportuna; al termine del ciclo
di elaborazione, la form potrà quindi continuare a leggere i messaggi
generati precedentemente, reagendo di conseguenza;
se però durante la fase di elaborazione andiamo ad interagire con un'altra
applicazione, ci accorgiamo che tale problema non esiste; ogni applicazione
viene infatti eseguita in multitasking rispetto alle altre, e il blocco di
una non significa il blocco dell'altra (salvo alcune eccezioni);
per essere precisi, windows gestisce una coda di messaggi per ogni thread;
un programma - o per meglio dire, un processo - è composto da almeno un
thread (nel caso di vb, a meno di utilizzare accorgimenti particolari, ogni
programma ha un solo thread);
tornando a doevents, tramite questa istruzione si riesce a portare avanti
l'elaborazione della coda dei messaggi anche se il sistema ha altro da fare;
se all'interno del loop di cui sopra, avessimo inserito una istruzione
doevents, avremo notato che il programma avrebbe continuato a rispondere ai
click del mouse come se il ciclo non fosse avvenuto;
sempre facendo riferimento all'esempio di prima, è sempre buona norma
evitare la possibilità di far ripartire un loop al cui interno è contenuto
un doevents - basterebbe ad esempio disabilitare il command button con un
semplice enabled=false - per evitare problemi di codice non rientrante o di
stack overflow;
ciao

Precisazioni accettate
pero, quote quote :)
Ciao, Alf

 diciamo che non e' bello ^_^;
Non č proprio cosě.
Fortunatamente, per quanto pietoso, il multitasking di windows non cede
tutto il processore ad una sola applicazione: sarebbe disastroso.
E' la tua app che si blocca per 15 sec.
Attenzione, perň: proprio per la sua natura il DoEvent scarica la coda di
messaggi, compresi input dell'utente, timer, e quant'altro, in un magico
intreccio policromatico :)
Ciao

 intreccio policromatico :)
...tendente al marroncino dal punto di vista del programmatore il piů delle
volte! :(