Per utilizzare operazioni temporizzate e i vantaggi
di un timer in
Visual Basic 6 si ricorre
al controllo
Timer di
VB6 che pesuppone la
presenza di un
form su cui collocarlo per poterlo utilizzare.
In alternativa è possibile utilizzare le
API di Windows
SetTimer e
KillTimer che permettono
di attivare un timer istruendo direttamente il nostro sistema operativo.
La soluzione dell'utilizzo delle API è molto più potente
e scalabile e si integra in maniera "pulita" all'interno
di oggetti e classi che vorremmo creare.
Le dichiarazioni per usare le API SetTimer e KillTimer sono le seguenti:
Private Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
Private Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, _
ByVal uElapse As Long, ByVal lpTimerfunc As Long) As Long
Non mi soffermerò nello spiegare il significato dei parametri:
per quello, vi rimando direttamente alla documentazione
presente sull'
MSDN. Mi preoccuperò invece di mostrarvi
un esempio espandibile e un caso di utilizzo.
Se abbiamo una classe (.cls) che necessita di un
poller
o di operazioni reiterate e/o temporizzate, abbiamo bisogno
di un form che non utilizzeremo per mostrarlo
ma solo per usare il controllo timer su esso contenuto.
Questa soluzione rallenta l'esecuzione del nostro programma
e impiega maggiori risorse e memoria.
L'alternativa è utilizzare le API
SetTimer e
KillTimer
direttamente con una classe che ho scritto:
cTimerWndLess
Per semplicità e comodità l'oggetto timer della classe
cTimerWndLess
ha la proprietà
Enable e
Interval esattamente come il controllo
timer e usa
SetTimer per far partire un timer e
KillTimer
per fermarlo. E' possibile creare più timers contemporanei,
basta creare più istanze dell'oggetto. Nota di carattere tecnico:
la notifica dell'evento del timer, trattandosi di una callback,
viene eseguita in un altro thread. (anche il controllo timer1 standard
fa lo stesso)
Esempio: Timer1 di cTimerWndLess
Prima di iniziare, creare un nuovo progetto EXE standard VB6,
aggiungere al progetto i files cTimerWndLess.cls
e modTimerWndLess.bas (i sorgenti sono in fondo)
Dim WithEvents Timer1 As cTimerWndLess
Set Timer1 = New cTimerWndLess
Timer1.Interval = 1000 ' milliseconds
Timer1.Enabled = True ' set it to False to stop timer
'Set Timer1 = Nothing ' use this to clean up the timer when app execution finishes
' -----------------------------------------------------------------------------
Private Sub Timer1_Timer()
' -----------------------------------------------------------------------------
Debug.Print "Timer event fired!"
End Sub
' -----------------------------------------------------------------------------
Ho usato un oggetto Timer di
cTimerWndLess all'interno
di un'altra classe che gestisce la comunicazione su una
porta serviale virtuale (COM6). La lettura dei dati su una seriale
è sincrona per cui ho piazzato un timer che fa polling di tanto
in tanto e all'arrivo dei dati memorizza in un buffer e scatena
un evento OnDataArrived (più o meno come Winsock).
Con questa classe che interagisce e istruisce le porte seriali COMx
"parlo" e invio messaggi tramite il mio telefonino.
Ma tornando a "cTimerWndLess" spero che vi sia utile, fatemi
sapere!
Sorgente di cTimerWndLess.cls
http://community.visual-basic.it/andrealisi/articles/25195.aspx
Sorgente di modTimerWndLess.bas
http://community.visual-basic.it/andrealisi/articles/25195.aspx