Newsgroup: it.comp.lang.visual-basic
Titolo: durante i loop su blocca tutto!!!

Volendo programmare una semplicissima sveglia, ho inserito il tempo in cui
deve accadere l'evento in una varabile chiamata Alarm.
Ho poi scritto un loop... until Alarm>Time... ed in uscita l'evento.
Il programmino funziona, solo che finché il loop é in esecuzione si blocca
tutto: non è possibile chiudere la finestra del programma né col suo tastino
di chiusura né col tasto di comando Esci inserito nel form: tutto bloccato
fino alla fine del loop.
E' chiaro che così non va, ma come posso verificare l'avvenire dell'evento
senza un loop o un qualsiasi altro ciclo???

 dell'evento senza un loop o un qualsiasi altro ciclo???
metti un DoEvents all'interno del ciclo
--
Fibia "no Zanna, scherzavo.. non ho parlato di DoEvents" FBI


Mai sentito parlare di programmazione "ad eventi"?
Puoi usare (in questo caso) un timer, o meglio ancora la SetTimer().
Le cose da evitare in un linguaggio ad eventi sarebbero:
- Loop chiusi
- DoEvents/ProcessMessages
- Timer
- varie ed eventuali :)
Ciao

 - varie ed eventuali :)
Vabbè, in questo caso se ne poteva probabilmente fare a meno, ma un bel do
while not eof() come lo interrompi se non ci metti un doevents?
Ciao
*Roby (in vena di punzecchiature)*

 while not eof() come lo interrompi se non ci metti un doevents?
E' per questo che ho detto "sarebbero".
Non voglio dire che quei costrutti sono inutili, ma che se si ricorre a
loro, la maggior parte delle volte, significa che c'è un sistema migliore.
Ciao

 loro, la maggior parte delle volte, significa che c'è un sistema migliore.
Ci ho pensato un po' e mi è venuto in mente un modo in cui interrompere
anche quel tipo di ciclo senza bisogno di doevents (così mi contraddico da
solo).
Poniamo che si voglia interrompere l'elaborazione sul click di un command
button. basta chiamare nel ciclo anche la GetAsyncKeyState(1) per vedere se
è stato premuto il pulsante sinistro del mouse, e la WindowFromPoint per
vedere se si è posizionati sul pulsante in questione.
Ovviamente nell'evento CmdButton_Click non va assolutamente nulla.
Comunque di solito quando voglio essere sicuro che la DoEvents non combini
casini uso un trucchetto che Balena chiama SafeDoEvents, che si fa con una
form modale aperta fuori dallo schermo che nella activate chiama un doevents
e si scarica.
Ciao
*Roby*

 e si scarica.
??? ti spiacerebbe spiegarmi i vantaggi ? e poi a me doevents non ha mai
creato casini... che può combinare, poverino ? =)
ciao!
Marco Trapanese


Interessante!
E cosi' cosa cambia rispetto alla DoEvents inserita direttamente nel ciclo?
RobertoA

 creato casini... che può combinare, poverino ? =)
Se è ben gestito niente, ma ti devi ricordare di considerare tutti i
possibili casi di rientranza nel codice. Fai conto che mentre fai una cosa,
l'utente può approfittare del doevents per chiamare un altra funzionalità di
programma, oppure anche la stessa. Il caso classico è un doppio click sul
pulsante "start" del ciclo, invece del click singolo.
Per evitare di pensarle tutte, spesso si preferisce evitare i doevents.
In ogni caso la passione di chi cerca i bachi per professione è proprio
quello di cliccare sui controlli/pigiare tasti sulla tastiera durante il
caricamento delle form o mentre la tua applicazione sta ciclando. Provare
per credere.
Ciao
*Roby*
P.S.
Non sono io quello contrario ai DoEvents. E'  Zanna. ;-)

 Non sono io quello contrario ai DoEvents. E'  Zanna. ;-)
certo, certo, l'avevo intuito.... :)
bye,
Marco

ahahah
avete trasformato il ng in una chat :)))
7-8 messaggi in meno di 3 ore :)
--
Fibia "Sakamoto" FBI

 ha scritto nel messaggio
news:ZQLe7.18423$SV4....@news1.tin.it...


 quando non deve toccare certe cose semplicemente le disabilito....
Purtroppo non sempre disabilitare basta. Ecco un esempio.
Crea un progetto nuovo e mettici sopra un command button. Poi incolla questo
codice:
Option Explicit
Dim iConta As Integer
Private Sub Command1_Click()
   Dim lAttesa As Long
   Command1.Enabled = False
   Debug.Print "entrato"
   iConta = iConta + 1
   lAttesa = Timer
   Do While lAttesa > Timer - 1
   Loop
   Command1.Enabled = True
   Debug.Print "uscito " & iConta
End Sub
Ora lancia il programma e fai un doppio click sul pulsante Command1 (doppio
click, non click). Vedrai che entra 2 volte nel ciclo anche se lo hai
disabilitato.
In questo caso succede proprio perché non ci sono DoEvents. Se metti un
DoEvents appena dopo il loop e prima della riabilitazione, non succede più
(con buona pace di Zanna ;-)).
Notare che se invece il DoEvents lo metti subito dopo a Command1.Enabled =
False, la rientranza avviene lo stesso. Praticamente sembra che sia
necessario che passi del tempo prima che la disabilitazione del pulsante sia
effettivamente eseguita.
Ciao
*Roby*

 ha scritto nel messaggio
news:hA3f7.25065$SV4.1...@news1.tin.it...


 Mmmmhhh, cambiare linguaggio?  >:-]
Non riuscirai a farmi cambiare idea! :)
Appena riesco a far funzionare anche linux (mannaggia a XFree86!) passerò a
php.
:)
Ciao