pierovb ha scritto:
Perfetto! Grazie. E' bastato un solo DoEvents prima del ciclo.
In realtà è "bastato" perché si tratta di un palliativo, ma il problema principale è che devi sapere come funziona il Timer o più in generale l'applicazione che stai realizzando con VB6.
Il componente Timer si interfaccia con una API di Windows che fa inviare all'applicazione un messaggio periodicamente (WM_TIMER) che viene tradotto nell'esecuzione del codice che hai assegnato al timer.
Quando arriva il messaggio, esso viene messo in una coda, assieme a tutti gli altri messaggi che arrivano all'applicazione, tra cui quelli di disegno, spostamento del mouse, clic, pressione di tasti, ecc.
Nel tuo caso, se fai partire la query al clic su un pulsante, dietro le quinte la tua applicazione riceverà un messaggio opportuno ed eseguirà l'evento del click in risposta. Se la query dura 20 secondi, quel messaggio richiederà 20 secondi per poter essere gestito e questo vuol dire che la tua applicazione non potrà gestire fino ad allora tutti gli altri messaggi in arrivo sulla coda, compreso quello del timer che dovrebbe monitorare il tempo di esecuzione.
Usare un DoEvents() significa dire all'applicazione di "scodare" i messaggi forzatamente: questo risolve (in parte) il tuo problema in quanto, durante il ciclo, se giunge un evento del timer questo può essere quindi gestito, a differenza della situazione precedente, ma assieme a quello vi sono potenzialmente anche altri eventi che potrebbero arrivare, ad esempio quello che rilancia la query o addirittura un evento di chiusura dell'applicazione, con effetti imprevedibili.
In generale, la soluzione a queste problematiche la si trova nei thread, ma in VB6 non ci sono.
Nel tuo caso comunque, è ancora più semplice: il Timer non è lo strumento adatto da utilizzare, poiché ti basta leggere la data/ora corrente prima di iniziare la query, e poi rileggerla nuovamente al termine, sottraendola a quella iniziale, per determinare in questo modo le ore, i minuti e i secondi trascorsi.
Nello stato attuale, pur funzionando, le tempistiche di esecuzione sono pure inficiate dal DoEvents() e non è necessario istanziare un Timer per ottenere il dato che ti serve.
Ciao!