Il blog di Andrea Lisi

Visual Basic 6.0

My Links

Blog Stats

Article Categories

Archives

Post Categories

Siti VB6 da non perdere

Wednesday, March 25, 2009 #

[VB6] Timer o SetTimer e KillTimer?

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

posted @ 5:51 PM | Feedback (2)