Newsgroup: it.comp.lang.visual-basic
Titolo: Polling

Come si fa un programmino che stà in polling su una seriale?
Basta usare un Timer che ogni secondo esegue una lettura sulla Com?
L'uso di un Timer, non rischia di bloccare il pc? oopure se parte ogni 
ipotetico secondo, non c'è il rischio che
non abbia ancora finito le operazioni e si riesegua?
Non so se mi sono spiegato.... potete illuminarmi?
ciao Sergio

 non abbia ancora finito le operazioni e si riesegua?
Un software non sta in polling.
Un software *fa* il polling.
Cioè, il tuo software di polling deve, ogni 'tempo t', inviare una 
richiesta alla periferica, e aspettare la risposta.
Questo è il polling.
Se invece è la periferica che decide di sparare, in autonomia, il tuo 
software non deve fare polling ma stare semplicemente in ascolto. A 
questo punto, MsComm ti mette a disposizione degli eventi che si 
scatenano quando arriva qualcosa. Quindi, carico zero per la cpu finchè 
non arriva qualcosa.
Ciao
Alberto
-- 
Ma noi no

non abbia ancora finito le operazioni e si riesegua?
Il polling su una seriale si fa tenendo in loop la proprietà .InBufferCount e
inserendo un DoEvents nel loop per scatenare gli eventi, altrimenti meglio usare
l'evento OnComm che è asincrono, ma la gestione è un pò più complessa
Qui c'è un esempio di uso con OnComm:
http://www.it-lang-vb.net/Documentazione/Articoli/MSCOMM.htm
ciao
  Stefano

Comunque, tornando ai tuoi dubbi, se hai un timer che ogni x 
millisecondi chiama una SUB, e questa ha un carico di lavoro esagerato, 
non rischi di accavallare le cose: se non termina la procedura, il timer 
non può scatenare l'evento.
Però se proprio non sei convinto (o se sto dicendo una cazzata) puoi 
sempre fare:
Private Sub Tuotimer_Timer()
   Tuotimer.Enabled = False
   Call Tua_Sub
End Sub
Private Sub Tua_Sub()
    'Do Something...
    '....
    Tuotimer.Enabled = True
End Sub
-- 
Quando noi ignoranti eravamo di più, tutto era più bello...
(A. Celentano)
Per rispondermi in privato, prima togli l'immondizia dalla testa.

 l'evento.
Giusto.
Per precisione: il timer non genera l'evento ogni x millisecondi, ma "x 
millisecondi dopo l'End Sub dell'evento precedente, o di un DoEvents".
Le cose non possono quindi accavallarsi.


> Le cose non possono quindi accavallarsi.
Perciò, se uno usa un DoEvents nella Sub richiamata dal timer, che 
succede? Il timer rischia di far eseguire comtemporaneamente due Sub 
identiche?


 Il timer rischia di far eseguire comtemporaneamente due Sub identiche?
No, a meno che uno non lo usi due volte.
Cioè, la sequenza potrebbe essere (cerco di mettermi nel tuo esempio):
0": Avvio timer (diciamo 1 secondo di interval)
1": Evento _Timer: procedura che gira per 5"
6": End Sub
7": Evento _Timer: procedura che gira per 5" (dovrebbe finire al 
secondo 7+5=12)
8": Doevents dentro la procedura->Riparte il timer
9": Evento _Timer: tenuto in buffer dal S.O.
10": altro DoEvents dentro la procedura _Timer avviata al secondo 7-> 
il sistema operativo scatena una seconda istanza di _Timer. La prima 
istanza viene congelata (mancava ancora 2" di esecuzione)
15": End Sub della SECONDA istanza. La prima istanza viene riesumata.
16": Evento _Timer: tenuto in buffer dal S.O.
17": End Sub della PRIMA istanza->Recupero eventi dal buffer->Parte Sub 
Evento _Timer


 ha scritto nel messaggio
news:mn.428c7d597...@hotmail.com...

Questo tuo modello non mi convince del tutto, in VB6 l'evento Timer non è mai
rientrante, nemmeno se lo infarcisci di DoEvents.
Lo si può provare così:
Private Sub Timer1_Timer()
Static Instance As Integer
Dim l As Long
    Instance = Instance + 1
    Debug.Print Timer; ": enter _Timer #" & Instance
    For l = 1 To 100000000
    Next
    For l = 1 To 100
        DoEvents
    Next
    For l = 1 To 100000000
    Next
    Debug.Print Timer; ": exit _Timer #" & Instance
    Instance = Instance - 1
End Sub
Puoi vedere che nessun evento Timer si innesca finché il precedente non è
uscito.
Non trovo più l'articolo, però mi sembrava di aver letto che questo meccanismo
fosse una protezione di VB per evitare appunto la rientranza.
Bye
Raf

 meccanismo fosse una protezione di VB per evitare appunto la rientranza.
In effetti era una mia presunzione.
Ho fatto una prova analoga alla tua, e devo dire che l'evento non 
riparte.
Il che è oggettivamente una porcheria.
Se io *volessi* rientrare?


 ha scritto nel messaggio
news:mn.42d57d59d...@hotmail.com...

Dovresti usare un timer di sistema (le API SetTimer e KillTimer), ma per questo
ti servirà un modulo .bas perché richiede una funzione di callback.
Bye
Raf