Differenze tra le versioni di "Timer"

Da Gambas-it.org - Wikipedia.
Riga 1: Riga 1:
La Classe '''Timer''' può essere creata da codice:
+
L'uso della Classe '''Timer''' è piuttosto semplice. L'unica attenzione è sull'uso massivo, perché può saturare le risorse di sistema e in casi eccessivi rendere impossibile l'uso dell'applicazione.
'''Private''' <Font Color= #B22222>timer1 As Timer</font>
+
 
 +
Ad ogni modo, l'oggetto è presente nella ''toolbox'' dell'ide di gambas: basta trascinarla sulla Form e impostare il periodo di attivazione (in millisecondi, 1 secondo=1000).
 +
<BR>In alternativa, è possibile usarlo all'interno di una classe non grafica (es. un processo sequenziale...). In questo caso basta creare una proprietà di di Classe di tipo ''Timer'', e il resto funziona allo stesso modo delle form.
 +
 
 +
L'oggetto ''Timer'' ha una Proprietà (''.Delay''), come detto, per impostare l'intervallo di tempo tra un tick e il successivo, ovvero, il timer scatena un Evento ogni qualvolta scade il tempo prefissato.
 +
<BR>Creare un Evento ''Timer'' in un Form è molto semplice: una volta inserito l'oggetto Timer nella form, basta farci un doppio click sopra, e verrà creato automaticamente un Evento "_Timer()"; altrimenti è possibile crearlo manualmente da codice con le stesse impostazioni:
 +
Private <Font Color= #B22222>timer1 As Timer</font>
 
   
 
   
 
   
 
   
 
  '''Public''' Sub Form_Open()
 
  '''Public''' Sub Form_Open()
 
   
 
   
   With <Font Color= #B22222>timer1 = New Timer As "timer1"</font>
+
   With <Font Color= #B22222>timer1 = New Timer As "tempus"</font>
 
  <Font Color= #006400>' ''In questo caso il "Timer" si attiva ogni 500 millisecondi:''</font>
 
  <Font Color= #006400>' ''In questo caso il "Timer" si attiva ogni 500 millisecondi:''</font>
 
     .Delay = 500
 
     .Delay = 500
Riga 15: Riga 21:
 
   
 
   
 
   
 
   
  '''Public''' Sub timer1_Timer()  <Font Color= #006400>' ''Viene sollevato l'evento "_Timer" (ogni ms 500)''</font>
+
  '''Public''' Sub <Font Color=#B22222><B>tempus_Timer()</b></fonT>   <Font Color=#006400>' ''Viene sollevato l'evento "_Timer" (ogni ms 500)''</font>
 
   
 
   
   <Font Color= #006400>' ''...qui fa qualcosa...''</font>
+
   <Font Color=#006400>' ''...qui fa qualcosa...''</font>
 
   
 
   
 
  '''End'''
 
  '''End'''
 +
All'interno dell'Evento è possibile inserire tutto il codice necessario per utilizzare il ''timer'' all'interno di una Classe (o di un Form).
 +
<BR>E' da tener ben presente che se le funzioni all'interno dell'Evento, superano l'intervallo impostato, l'Evento viene chiamato ulteriormente. Ciò può creare grossi problemi, in quanto gli eventi si accavallano, e possono rovinare il lavoro fatto nell'Evento precedente.
 +
<BR>In questi casi è utile avere la possibilità di arrestare momentaneamente il ''timer'' (esiste un Metodo apposito nella stessa Classe Timer: .Stop(), o anche assegnare alla Proprietà ".Enabled" il valore booleano ''False''), che verrà riattivato al termine della procedura.
 +
 +
Il ''timer'' può essere utilizzato anche come ''one-shot'' (un solo evento). In questo caso è sufficiente disabilitarlo in modo definitivo una volta entrati nel Evento Timer.
 +
<BR>Un altro suggerimento da poter dare è il seguente: alla chiusura (''destroy'') della Classe contenente il ''Timer'', è sempre meglio arrestare in ogni caso (Con il predetto Metodo ".Sto()" oppure ponendo "Enable = False"), onde evitare che rimanga appeso e attivo all'interno dell'applicazione, causando guai. In un Form è sufficiente inserirlo nell'evento Close; negli oggetti in genere basta inserirlo nel [[Metodi_New()_e_Free()_degli_oggetti|metodo speciale _free()]].
  
  
 
===Evitare un ritardo nella <SPAN style="text-decoration:underline">prima</span> attivazione del ''Timer''===
 
===Evitare un ritardo nella <SPAN style="text-decoration:underline">prima</span> attivazione del ''Timer''===
L'esempio precedente prevede un ritardo, posto con la proprietà ''.Delay'', di 500 millisecondi. Questo ritardo avverrà anche al momento della sua prima attivazione, ossia della partenza del ''Timer'' medesimo. Per ovviare a questo ritardo in fase di prima attivazione (partenza iniziale), si dovrà porre la proprietà ''.Delay'' ad 1 millisecondo (ma se non interessa una partenza con questo bassissimo ritardo, ovviamente si può porre un qualunque valore). La definizione del ritardo principale (quello che nel precedente esempio era di ms 500) potrà essere posta altrove (anche nella sub-routine scatenata dall'evento ''_Timer''):
+
Si è notato che al momento della prima attivazione del ''Timer'' (ossia della sua prima partenza nell'ambito del medesimo processo) si registra un leggero ritardo.
  '''Private''' timer1 As Timer
+
<BR>Per ovviare a questo ritardo in fase di prima attivazione (partenza iniziale), si dovrà porre la proprietà ''.Delay'' ad 1 millisecondo (ma se non interessa una partenza con questo bassissimo ritardo, ovviamente si può porre un qualunque valore). Nel caso di tale assegnazione per eliminare il ritardo iniziale, la definizione del ritardo principale, quello effettivamente voluto (che ad esempio nel precedente esempio era di ms 500) potrà essere posta altrove (anche nella sub-routine scatenata dall'evento ''_Timer''):
 +
  Private timer1 As Timer
 
   
 
   
 
   
 
   
 
  '''Public''' Sub Form_Open()
 
  '''Public''' Sub Form_Open()
 
   
 
   
  With timer1 = New Timer As "timer1"
+
  With timer1 = New Timer As "timer1"
  <Font Color= #006400>' ''Qui poniamo il ritardo minimo della prima attivazione del "Timer":''</font>
+
  <Font Color=gray>' ''Qui poniamo il ritardo minimo (ms 1) della prima attivazione del "Timer":''</font>
    <Font Color= #B22222>.Delay = 1</font>
+
    <Font Color= #B22222>.Delay = 1</font>
  End With
+
  End With
 
   
 
   
 
  '''End'''
 
  '''End'''
Riga 39: Riga 52:
 
  '''Public''' Sub Button1_Click()
 
  '''Public''' Sub Button1_Click()
 
   
 
   
  <Font Color= #006400>' ''Qui ad esempio attiviamo il "Timer":''</font>
+
  <Font Color=gray>' ''Qui impostiamo il ritardo principale e l'attivazione del "Timer":''</font>
    timer1.Start
+
  With timer1
 +
    <Font Color= #B22222>.Delay = 500</font>
 +
    .Start
 +
  End With
 
   
 
   
 
  '''End'''
 
  '''End'''
Riga 46: Riga 62:
 
   
 
   
 
  '''Public''' Sub timer1_Timer()
 
  '''Public''' Sub timer1_Timer()
 +
 
 +
  <Font Color= #006400>' ''...qui fa qualcosa...''</font>
 
    
 
    
<Font Color= #006400>' ''Possiamo impostare qui il ritardo principale del "Timer":''</font>
 
    timer1<Font Color= #B22222>.Delay = 500</font>
 
 
  <Font Color= #006400>' ''...qui fa qualcosa...''</font>
 
 
 
  '''End'''
 
  '''End'''
  
  
==Usare l'oggetto speciale ''Timer''==
+
===Semplice esempio di uso del ''Timer''===
L'uso del ''Timer'' potrà avvenire, oltre attraverso la creazione della specifica Classe ''Timer'', anche ponendo sul Form l'oggetto speciale ''Timer'' presente nell'IDE di Gambas.
+
Come già detto, l'uso del ''Timer'' potrà avvenire, oltre attraverso la creazione da codice della specifica Classe ''Timer'', anche ponendo sul Form l'oggetto speciale ''Timer'' presente nel ''toolbox'' dell'IDE di Gambas.
  
 
+
Facciamo un altro semplice semplice esempio esplicativo del funzionamento del ''Timer'', supponendo in questo caso che sia stato posto sul ''Form'' l'oggetto speciale ''Timer'':
Facciamo un altro semplice esempio esplicativo del funzionamento del ''Timer'', suppondendo in questo caso che sia stato posto sul ''Form'' l'oggetto speciale ''Timer'':
+
  Private i As Integer
  '''Private''' a As Integer
 
 
 
'''Public''' Sub Form_Open()
 
 
  With Timer1
 
<Font Color= #006400>' ''All'avvio poniamo il Timer come disabilitato:''</font>
 
    .Enabled = False
 
<Font Color= #006400>' ''poniamo il Delay inizialmente a 1 millisecondo,''
 
' ''per non generare alcun ritardo quando premeremo il tasto "Button1":''</font>
 
    .Delay = 1
 
  End With
 
 
'''End'''
 
 
   
 
   
 
   
 
   
 
  '''Public''' Sub Button1_Click()
 
  '''Public''' Sub Button1_Click()
 
   
 
   
  <Font Color= #006400>' ''Viene abilitato il Timer, il quale solleva l'evento "_Timer"''
+
  <Font Color=gray>' ''Viene posto un ritardo pari a ms 100:''</font>
  ' (l'effetto della proprietà ".Enabled = True" è equivalente al metodo ".Start"):''</font>
+
  Timer1.Delay = 100
      Timer1.Enabled = True
+
 
 +
<Font Color=gray>' ''Viene abilitato il Timer, il quale solleva l'evento "_Timer()".''
 +
  ' '''(''l'effetto della proprietà ".Enabled = True" è equivalente al metodo ".Start"''):'''</font>
 +
  Timer1.Enabled = True  
 
        
 
        
 
  '''End'''
 
  '''End'''
Riga 87: Riga 89:
 
  '''Public''' Sub Timer1_Timer()  <Font Color= #006400>' ''Subroutine invocata con l'attivazione di Timer''</font>
 
  '''Public''' Sub Timer1_Timer()  <Font Color= #006400>' ''Subroutine invocata con l'attivazione di Timer''</font>
 
   
 
   
  <Font Color= #006400>' ''Viene posto un ritardo pari a ms 100:''</font>
+
<Font Color=gray>' ''Dunque, ogni ms 100 verrà stampato in console il nuovo valore della variabile " a ":''</font>
    Timer1.Delay = 100
+
  Print i
 
   
 
   
<Font Color= #006400>' ''Dunque, ogni ms 100 verrà stampato in console il nuovo valore della variabile " a ":''</font>
+
  Inc i
    Print a
 
 
   
 
   
    Inc a
+
'''End'''
 +
 +
 +
'''Public''' Sub Button2_Click()
 
   
 
   
 +
<Font Color=gray>' ''Il Timer viene arrestato:''</font>
 +
  Timer1.Enabled = False
 +
     
 
  '''End'''
 
  '''End'''

Versione delle 17:14, 13 ago 2020

L'uso della Classe Timer è piuttosto semplice. L'unica attenzione è sull'uso massivo, perché può saturare le risorse di sistema e in casi eccessivi rendere impossibile l'uso dell'applicazione.

Ad ogni modo, l'oggetto è presente nella toolbox dell'ide di gambas: basta trascinarla sulla Form e impostare il periodo di attivazione (in millisecondi, 1 secondo=1000).
In alternativa, è possibile usarlo all'interno di una classe non grafica (es. un processo sequenziale...). In questo caso basta creare una proprietà di di Classe di tipo Timer, e il resto funziona allo stesso modo delle form.

L'oggetto Timer ha una Proprietà (.Delay), come detto, per impostare l'intervallo di tempo tra un tick e il successivo, ovvero, il timer scatena un Evento ogni qualvolta scade il tempo prefissato.
Creare un Evento Timer in un Form è molto semplice: una volta inserito l'oggetto Timer nella form, basta farci un doppio click sopra, e verrà creato automaticamente un Evento "_Timer()"; altrimenti è possibile crearlo manualmente da codice con le stesse impostazioni:

Private timer1 As Timer


Public Sub Form_Open()

  With timer1 = New Timer As "tempus"
' In questo caso il "Timer" si attiva ogni 500 millisecondi:
    .Delay = 500
' Quindi viene attivato:
    .Start
  End With

End


Public Sub tempus_Timer()   ' Viene sollevato l'evento "_Timer" (ogni ms 500)

  ' ...qui fa qualcosa...

End

All'interno dell'Evento è possibile inserire tutto il codice necessario per utilizzare il timer all'interno di una Classe (o di un Form).
E' da tener ben presente che se le funzioni all'interno dell'Evento, superano l'intervallo impostato, l'Evento viene chiamato ulteriormente. Ciò può creare grossi problemi, in quanto gli eventi si accavallano, e possono rovinare il lavoro fatto nell'Evento precedente.
In questi casi è utile avere la possibilità di arrestare momentaneamente il timer (esiste un Metodo apposito nella stessa Classe Timer: .Stop(), o anche assegnare alla Proprietà ".Enabled" il valore booleano False), che verrà riattivato al termine della procedura.

Il timer può essere utilizzato anche come one-shot (un solo evento). In questo caso è sufficiente disabilitarlo in modo definitivo una volta entrati nel Evento Timer.
Un altro suggerimento da poter dare è il seguente: alla chiusura (destroy) della Classe contenente il Timer, è sempre meglio arrestare in ogni caso (Con il predetto Metodo ".Sto()" oppure ponendo "Enable = False"), onde evitare che rimanga appeso e attivo all'interno dell'applicazione, causando guai. In un Form è sufficiente inserirlo nell'evento Close; negli oggetti in genere basta inserirlo nel metodo speciale _free().


Evitare un ritardo nella prima attivazione del Timer

Si è notato che al momento della prima attivazione del Timer (ossia della sua prima partenza nell'ambito del medesimo processo) si registra un leggero ritardo.
Per ovviare a questo ritardo in fase di prima attivazione (partenza iniziale), si dovrà porre la proprietà .Delay ad 1 millisecondo (ma se non interessa una partenza con questo bassissimo ritardo, ovviamente si può porre un qualunque valore). Nel caso di tale assegnazione per eliminare il ritardo iniziale, la definizione del ritardo principale, quello effettivamente voluto (che ad esempio nel precedente esempio era di ms 500) potrà essere posta altrove (anche nella sub-routine scatenata dall'evento _Timer):

Private timer1 As Timer


Public Sub Form_Open()

 With timer1 = New Timer As "timer1"
' Qui poniamo il ritardo minimo (ms 1) della prima attivazione del "Timer":
   .Delay = 1
 End With

End


Public Sub Button1_Click()

' Qui impostiamo il ritardo principale e l'attivazione del "Timer":
 With timer1
   .Delay = 500
   .Start
 End With

End


Public Sub timer1_Timer()
  
 ' ...qui fa qualcosa...
 
End


Semplice esempio di uso del Timer

Come già detto, l'uso del Timer potrà avvenire, oltre attraverso la creazione da codice della specifica Classe Timer, anche ponendo sul Form l'oggetto speciale Timer presente nel toolbox dell'IDE di Gambas.

Facciamo un altro semplice semplice esempio esplicativo del funzionamento del Timer, supponendo in questo caso che sia stato posto sul Form l'oggetto speciale Timer:

Private i As Integer


Public Sub Button1_Click()

' Viene posto un ritardo pari a ms 100:
 Timer1.Delay = 100
 
' Viene abilitato il Timer, il quale solleva l'evento "_Timer()".
' (l'effetto della proprietà ".Enabled = True" è equivalente al metodo ".Start"):
 Timer1.Enabled = True   
      
End


Public Sub Timer1_Timer()   ' Subroutine invocata con l'attivazione di Timer

' Dunque, ogni ms 100 verrà stampato in console il nuovo valore della variabile " a ":
 Print i

 Inc i

End


Public Sub Button2_Click()

' Il Timer viene arrestato:
 Timer1.Enabled = False
      
End