Newsgroup: it.comp.lang.visual-basic
Titolo: Timer troppo lento

Ciao a tutti
Premetto che uso VB da principiante e forse in maniera " non canonica..."
Devo comunicare con la seriale a intervalli regolari e precisi
delle stringhe di 8 o 9 byte (ora vado a 19200)
Ma ho notato che se la faccio temporizzare da un timer
anche se lo imposto a 1  è troppo lento circa 56 msec e
io dovre andare almeno intorno ai 10 msec con
la possibilità di regolare +/- 1 msec
Se le stringhe che invio le unisco in un unica botta non mi lasciano il
tempo
tra l'una e l'altra x la risposta a dei dispositivi collegati che
rispondono...
Usare un ciclo for per temporizzare un loop di continuo invio tra una
stringa
e l'altra mi sembra poco " bello" anche se ricordo se eiste un modo tipo "do
event"
di fare sentire gli eventi al PC anche durante un ciclo for a vuoto.
Se qualcuno ha qualche idea...
Grazie a tutti in anticipo
ALX

 
prova a dare uno sguardo qui:
http://www.vbaccelerator.com/codelib/ssubtmr/hirestmr.htm
HTH
bye
r

di fare sentire gli eventi al PC anche durante un ciclo for a vuoto.
Io per queste cose uso la GetTickCount, abbastanza precisa se non ci
sono altri processi in corso.
In ogni caso la precisione dei timing che puoi ottenere su windows non
è come quella di un microcontroller, quello scordatelo.
Esempio di un polling con GetTickCount:
Dim T as Long
T=GetTickCount+10
Do:
Loop while T< GetTickCount
dovrebbe uscire dal loop 10msec dopo, naturalmente se hai 12 finestre
aperte non è detto.
 
_________________________________________
Funzione GetTickCount
Declare Function GetTickCount Lib "kernel32" Alias "GetTickCount" ()
As Long
La funzione GetTickCount ritorrna il numero di millisecondi che sono
trascorsi da quando è stato avviato windows 
La funzione non richiede parametri
Il tempo trascorso, viene memorizzato come valore DWORD. Il timer
viene azzerato se Windows è in esecuzione continua per 49,7 giorni
Dword 
Porzione di memoria, solitamente una variabile che ha una lunghezza di
quattro bytes.  Il termine DWORD, letteralmente deriva da double word.
dove per WORD, si intende una variabile di due bytes 
_________________________________________
ciao
  Stefano


ha scritto:
Meglio:
Declare Function GetTickCount Lib "kernel32" Alias "GetTickCount" ()
As Long
Dim T as Long
T=GetTickCount+10
Do: DoEvents
Loop while T< GetTickCount
ciao
  Stefano

 la possibilità di regolare +/- 1 msec
Sì, perchè usa il clock del PC che è appunto intorno ai 55 ms.
Domanda stupida: perchè vuoi gestire la seriale in questo modo?
Ciao 


P.S.: Windows non č un sistema real-time, quindi la temporizzazione come la 
stai pensando scordatela.
Potrebbero interferire diversi fattori che porterebbero il tuo timing a 
valori completamente inaspettati.
Ciao 

stai pensando scordatela.
Beh, perň io ricordo di aver trovato (ma non dove) un controllo che si
chiamava high resolution timer, probabilmente legato all'interrupt
70...
--
Ciao!
Luca Menegotto

 70...
basta che il codice che c'è nell'evento impieghi più dell'interval e se
punto e a capo.
Comunque continuo a sostenere che è un approccio all'uso della seriale poco
ortodosso.
Ciao
--
Reporting tool: 
http://www.neodatatype.net

 ALX
Per realizzare timing precisi per uno scopo analogo (ma in una DLL C++,
multithreaded) abbiamo usato le API QueryPerformanceCounter e
QueryPerformanceFrequency.
Questa è l'implementazione di una funzione che serve per attendere un tempo in
ms.
void FineWait(long timeMicroS)
{
 LARGE_INTEGER counter;
 LARGE_INTEGER freq;
  __int64 timeout;
  QueryPerformanceCounter(&counter);
  QueryPerformanceFrequency(&freq);
  timeout = counter.QuadPart + ((timeMicroS * freq.QuadPart) / 1000000);
   do{
    QueryPerformanceCounter(&counter);
    Sleep(0);
   } while(counter.QuadPart < timeout);
}
Non è difficile tradurla in VB, comunque puoi anche vedere qui:
http://support.microsoft.com/support/kb/articles/Q172/3/38.asp
Bye
Raf

ortodosso.
Beh, usando il pc per gestire controlli esterni può capitare di aver
bisogno di inviare stringhe di comando secondo tempi prestabiliti.
Con VB è molto difficile farlo, per riuscirci bisognerebbe usare i
servizi di Windows ma è una cosa abbastanza complicata.
Ne abbiamo già parlato a lungo qui:
http://shorterlink.com/?8391WL
ciao
  Stefano

Ciao
Grazie a tutti per la cortesia nelle rispste
Come ha già intuito SB ( che ormai mi fa da balia :-) la mia applicazione è
rivolta
alla comunicazione con in Microcontrollore su protocollo ModBus RTU
A chi interessa...
In pratica c'è un master (nel mio caso il PC) che continua a fare richiste a
una serie di dispositivi
slave ai quali viene associato un indirizzo.
E' importante per me gestire la comunicazione in modo che tra un pacchetto
di richiesta e uno di risposta
venga perso meno tempo possibile, a 19200 una richiesta è i circa 5ms
Da notare che il PC mi serve solo come master di test... ( x me)
Io non facco SoftWare ma faccio gli slave...
Ma i test devo farli in modo da capire effettivamente a che tempistiche
posso arrivare
con reti di quest tipo nelle applicazioni più disparate...
Comunque x ora ho risolto così
esempio con 10 slave :
genero un array di 10 stringhe
    Dim Messaggio(10) As String
creo una sub wait con un DoEvents dentro che fa il ritardo ma
gestisce comunque gli eventi ( al massimo devo fermare il ciclo stesso !)
Sub Wait()
    For x = 1 To 4000
        DoEvents
    Next x
End Sub
altro ciclo che continua a sparare fuori una stringa
e richiama un ritardo wait
Così facendo con il 4000 tra una richiesta e l'altra passano 20ms circa
ma ho la possibilità di ridurre uesto temop fina a calibrare con precisione
la frequenza della richiesta
Per ora mi basta
ovvio se delle risposte devo fare delle elaborazioni sono fregato...
scondo voi.. con i metodi suggeriti  risolvo anche questo ?
tutto si risolverebbe se il timer di VB si potesse abbassare fino almeno a
10 ms !
Grazie ancora !
Ciao
ALX