Newsgroup: it.comp.lang.visual-basic
Titolo: Wait, eventi e stack delle chiamate

Ciao a tutti,
schematizzo il mio problema con un esempio:
command_click()
debug.print now
[wait 5 sec]
debug.print now
Tutto funziona.
Ma se scateno un secondo evento command_click() dopo x secondi da un primo 
evento (con x<5 sec, ovvero mentre il primo è ancora in esecuzione) il nuovo 
comand_click entra nello stack delle chiamate prima del vecchio.
Il risultato è che il vecchio command termina la sua esecuzione solo dopo 
che ha finito il nuovo, ovvero dopo 5 sec + x sec dove x è l'istante che 
intercorre tra la prima pressione del command e la seconda.
Conoscete soluzioni per ovvire al problema?
grazie
Alessandro 

Dopo dura riflessione, Alex ha scritto :

Togliere quel 'doevents' da quella cosa che hai chiamato 'wait'.
Alberto
-- 
A questo punto hanno trovato un muro,
un muro duro, molto molto duro,
che siamo noi.

 intercorre tra la prima pressione del command e la seconda.
nel tuo [wait] c'è un qualche doevents?
-- 
Salutoni
Sergio
Oroscopo
Sagittario: questa mattina era meglio se restavate a letto.
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 ha scritto nel 
messaggio news:e0t91g$tb9$1...@news.newsland.it...


 Se tolgo il doevents il timer si ferma e l'utilizzo della cpu va al 99%...
Ci metti uno sleep che ti spezza in frazioni il tempo d'attesa, e metti 
il doevents solo ed esclusivamente se ti serve gestire qualche evento 
(come, ad esempio, il timer).
Per la gestione della sequenzializzazione di eventi che invece non vuoi 
parallelizzare, basta un flag booleano, che imposti a true ad inizio 
evento e a false alla fine.
Ciao


 evento e a false alla fine.
In questo modo però perdo l'evento... io voglio solo serializzarlo...
Grazie
Alessandro 

 In questo modo però perdo l'evento... io voglio solo serializzarlo...
Fatti una coda degli eventi.
Se entrando in uno degli eventi da serializzare, trovi il flag a true, 
fai un add nella collection degli eventi.
Alla fine dell'evento, resetti il flag e invochi il primo evento che 
trovi in coda. E così via.


 in coda. E cosě via.
Ci avevo pensato, ma in questo modo l'utente non ha la percezione che 
l'applicazione č occupata e tende a premere il comando n volte, facendo un 
casino...
ci vorrebbe qualcosa che blocchi la gui tipo un form modale invisibile che 
viene scaricato al termine della routine... perň in forma piů elegante
Volendo posto il problema in forma piů generica:
avendo un componente che dialoga in modo asincrono con una periferica, come 
č possibile rendere la chiamata al componente sincrona?
Grazie
Alessandro

 casino...
Deciditi...
L'evento che scatta mentre il programma è occupato, o vuoi perderlo, o
vuoi conservarlo. Dici di volerlo conservare, ma poi temi duplicati da
parte di utenti "nervosi".
Il mio consiglio sarebbe di cestinarlo, magari dando un messaggio
all'utente del tipo "Ehi, un po' di pazienza, sto lavorando per te"


 sincrona?
Questo potrebbe essere un pattern:
    Operation.StartAsync
    MainGUI.Enabled = False
    WaitDialog.Show
    Do While Not Operation.Completed
        DoEvents
    Loop
    WaitDialog.Hide
    MainGUI.Enabled = True
HTH
Bye
Raf