Newsgroup: it.comp.lang.visual-basic
Titolo: [?]Timed Events

In un post precedente ho mostrato 2 modi che spesso adopero per
scatenare eventi temporizzati senza l'uso di ocx (che poi IMVHO non
fanno nulla di piu'!).
Vorrei aprire un dibattito sull'uso dei due metodi sopracitati e di
metodi eventualmente migliori (o peggiori e quindi sconsigliati).
Riporto:
1)
Interval alto (nell'esempio 10000) e nel codice gestione degli
incrementi:
Private Sub Timer1_Timer()
   Static tTime As Long
   tTime = tTime + 10
   '17:30 = 17*3600 + 30*60 secondi
   If tTime >= 63000 Then
      tTime = 0
      'Procedura
   End If
End Sub
2)
Interval alto (anche 30000) ed uso dell'ora di sistema.
Il booleano serve ad evitare che la procedura venga eseguita piu' volte
nello stesso minuto.
Private Sub Timer1_Timer()
   Static bDone As Boolean
   If Hour(Time) = 17 And Minute(Time) = 30 And Not bDone Then
      bDone = True
      'Esegui procedura
   Else
      bDone = False
   End If
End Sub
In particolare: commenti sull'uso di Static per le variabili del Timer?
Conoscete sistemi meno onerosi?
Lokar
--
Sito Comune: 
http://www.it-lang-vb.net/
Manifesto: 
http://www.it-lang-vb.net/docs/Manifesto.txt


Nel thread precedente, in realtà veniva chiesto come realizzare un Timer con
periodo molto lungo. Questo è leggermente diverso da schedulare eventi ad
orari precisi.
Riporto qui sotto come faccio io.
Sostanzialmente verifico quanto tempo è passato dall'ultima esecuzione (nel
Form_Load metto Ultima_Operazione a #01/01/1900#), lo confronto con il
numero di minuti del periodo che mi interessa, e se ho superato il limite
eseguo.
In funzione della precisione che voglio riduco l'Interval del timer (per
operazioni che eseguono ogni n ore, non ci sono generalmente problemi anche
usando Interval di 60000).
Private Sub Timer1_Timer()
If (Now - Ultima_Operazione) < Periodo * Minuti Then
    Exit Sub
End If
'Qua Eseguo l'operazione da temporizzare
'........
Ultima_Operazione = Now
End Sub
In un modulo a parte:
Public Ultima_Operazione as Date
Public Periodo as Double
Public Const Minuti As Double = 0.000694444444
Nel Form_Load:
Ultima_Operazione=#01/01/1900#
Periodo=480 'in minuti
Ciao
Alberto

 metodi eventualmente migliori (o peggiori e quindi sconsigliati).
Ho pubblicato la mia versione nel 3d "Controllo Timer"

 Periodo=480 'in minuti
Visto che è un thread di meglio-peggio, mi sembra lecito porre la seguente
domanda:
perchè fare uso della funzione
(Now - Ultima_Operazione) < Periodo * Minuti
invece di
datediff("n", Ultima_Operazione, now) < Periodo
che mi sembra più leggibile?
Forse qualche problema di prestazioni?
Salutoni
Sergio

 che mi sembra più leggibile?
Il motivo è di tipo storico.
La sub che ho riportato era nata per intervalli che potevano andare da pochi
secondi a molte ore.
Con il datediff, utilizzando "n" come criterio, viene riportata solo la
parte intera dell'intervallo, per cui mi trovavo in difficoltà scendendo
sotto al minuto, o ad esempio se avessi voluto un intervallo di 1'30".
Con il codice riportato, imposto Periodo=1.5, e funziona. Analogamente,
posso impostare Periodo=10000, e funziona allo stesso modo.
Ovviamente, se dovessi riscrivere alcuni miei sw, potrei anche mettere mano
alla cosa, ad esempio usando il datediff con il criterio a "s", e
considerando come confronto il valore di Periodo*clng(60).
Ciao
Alberto