Newsgroup: it.comp.lang.visual-basic
Titolo: Informazioni su timer

Salve a tutti,
sto realizzando un applicazione che permette all' utente di memorizzare gli
appuntamenti personali in un database.
Tale applicazione si avvia all' aperture di windowse rimane in esecuzione
fino alla chiusura.
Ora vorrei far in modo che se vi è un appuntamento a una certa ora appai un
messagio.
Ho pensato allora di piazzarci un Timer con  intervallo 60000  e inserire il
seguente codice:
Private Sub Timer1_Timer()
    Set objRs = New ADODB.Recordset
    strSQL = "SELECT * FROM APPUNTAMENTI WHERE DATA='" & Now() & "'"
    objRs.Open strSQL, objConn, adOpenDynamic
    If objRs.EOF = False Then
                MsgBox("Bla bla bla bla")
    End if
    objRs.Close
    Set objRs = Nothing
End Sub
Il fatto è che in questo modo io costringo il programma ad effettuare ad
ogni minuto una query al database con utilizzo di risorse che mi appaiono
eccessive (o sbaglio).
Esiste un modo migliore?
Ciao a tutti

 Esiste un modo migliore?
imho non č un utilizzo eccessivo delle risorse. se proprio tu volessi fare
il raffinato, potresti farti una copia "locale" degli impegni, diciamo
quelli di un'ora, e limitarti a controllare quelli (ovviamente ad ogni ora
dovresti caricare gli impegni dell'ora successiva), ma non saprei dire se
vale la pena di impostare un simile mulino
salutoni
sergio

     strSQL = "SELECT * FROM APPUNTAMENTI WHERE DATA='" & Now() & "'"
In secondo luogo al posto di "SELECT *" scrivi "SELECT top 1
nome_campo_chiave" in modo da chiedere e ricevere solo i dati minimi che ti
servono per sapere se c'è un appuntamento.
Infine attento a WHERE DATA='" & Now() & "'" in quanto è probabile che così
ti perdi molti appuntamenti.
Ti consiglio un " DATA BETWEEN A AND B" con A e B scelti in modo opportuno
(qualche minuto prima e dopo l'appuntamento).
Metodo 2: caching dei dati.
Se l'applicazione non è condivisa, ovvero tutti gli appuntamenti dell'utente
sono inseriti tramite lo stesso Pc dell'utente in cui gira la tua
applicazione, puoi cashare in memoria i dati dei prossimi appuntamenti
caricandoli all'inizio e aggiungendoli quando l'utente crea un nuovo
appuntamento, senza dover interrogare il DB.
Se l'applicazione è condivisa potresti pensare ad un'applicazione server con
il meccanismo di caching di cui sopra e le applicazioni client che chiedono
info sugli appuntamenti tramite Winsock.
Metodo 3: 'operazioni pianificate'
Ulteriore possibilità: ogni volta che inserisci un appuntamento inserisci
una voce nelle 'operazioni pianificate'  di windows (non so come fare) in
modo che il tuo programma venga invocato solo quando serve.
termoPilucco.

 ti perdi molti appuntamenti.
Perche' "probabile" ?
Alla fine, si fa la stessa quesy ogni minuto...
Gli appuntamenti DEVONO venire fuori :)
Akuz , eterno NB :)

 Esiste un modo migliore?
Spero di non offendere i vari DBisti del NG, ma non ti basta leggere qual'e'
il prossimo appuntamento da ricordare una sola volta e poi controllare solo
data e ora del sistema con il dato reperito dal DB  ??
Questo invece di fare polling sul DB....

 ha scritto nel messaggio
news:EGUQa.34739$it4.8...@news1.tin.it...

Scusate se ho h outilizzato la sintassi errata (SELECT * FROM APPUNTAMENTI
WHERE DATA='" & Now() & "), era solo per far capire il concetto.
Il suggerimento di Rio mi sembra molto interessante ...
PS per AKUMA
Select top 1 ... estrae solo uno degli n record di un database (in base a
WHERE  ed ORDER BY )
grazie a tutti

 Alla fine, si fa la stessa quesy ogni minuto...
Sì, ma Windows potrebbe non generare l'evento del timer in tempo per vari
motivi (non è un sistema realtime).
Magari mentre legge una periferica fa slittare l'evento di quel secondo che
porta il Now() al minuto successivo.
Senza contare che NOW(), come è scritto nella query include anche i secondi.
termoPilucco

 Gli appuntamenti DEVONO venire fuori :)
Giovane padawan, conoscere il lato oscuro devi tu :-)
Se imposti l'intervallo a 60 secondi spaccati, ti basta un po' di carico in
piu' della macchina per far slittare di qualche istante il timer (nel senso
che l'intera applicazione puo' non avere assegnate risorse CPU in tempo) e
ti perdi un giro...
Ciao
--
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown

 suggerimento piu' performante, a costo di poco codice in piu'.
Sì, però il risultato è che l'applicazione perde la possibilità di essere
condivisa:
se qualcuno inserisce un appuntamento fissato entro un'ora dalla macchina Y,
la macchina X, che aveva già letto un'ora prima la lista degli appuntamenti
non è al corrente di questo nuovo evento.
A meno che, per esempio con winsock, ogni qualvolta viene inserito in nuovo
app. l'applicazione comunica broadcast che bisogna fare un bel refresh degli
appuntamenti.
termoPilucco.