Newsgroup: it.comp.lang.visual-basic
Titolo: Timer preciso

Ciao a tutti, sto cercando di sviluppare un sistema di acquisizione il quale
dovrebbe fornirmi dei dati ogni circa 30ms. Ho una scheda a cui collego un
trigger @30Hz e circa ogni 30 ms devo recuperare i dati acquisiti. Il
problema č che so di poter leggere i dati acquisiti solo interrogando
periodicamente (T<<30ms) una funzione. Penso che in generale ci siano due
strade (con VB): ciclo do..while o timer. Il concetto č che il do..while mi
occupa la CPU al 100% mentre il timer non rispetta tempi cosě brevi.
Qualcuno sa darmi qualche idea su come risolvere la cosa?
Grazie mille a tutti in anticipo
Giuseppe


puoi usare le API:
Declare Function GetTickCount Lib "kernel32" () As Long
che dà una precisione di 1msec, io la uso per dei controlli in polling
proprio con 30msec circa e mi sembra sufficentemente precisa.
Oppure anche:
Private Declare Function QueryPerformanceCounter Lib "Kernel32.dll"
(lpPerformanceCount As LARGE_INTEGER) As Long
Private Declare Function QueryPerformanceFrequency Lib "Kernel32.dll"
(lpFrequency As LARGE_INTEGER) As Long
'Il numero è rappresentato come HighPart*2^32 + LowPart.
Private Type LARGE_INTEGER
    LowPart As Long
    HighPart As Long
End Type
che sono un po più complicate da gestire.
ciao
  Stefano

 il timer non rispetta tempi così brevi.
Il timer ha risoluzione di 1ms. A te servono 30ms.
Non vedo il problema (a meno che la tua funzione non lavori per più di 30ms,
ma allora ti rendi conto anche tu che non ci puoi saltare fuori...).
Ciao
Alberto

Il 12/03/2004 11.12, Giuse scrisse:

http://www.vbaccelerator.com/home/VB/Code/Libraries/HiResTimer/article.asp
ciao
	maxx
-- 
NOSPAM: Rimuovere i trattini dallo username!
Cut hyphens from my username!


Quel che dici tu è vero.. ma in quali condizioni? Se il sistema non sta
facendo altro. Se processo i dati, windows soddisfa il timer quando c'è
tempo e la risoluzione (termine sbagliato) del ms non è costante. La
funzione lavora per circa 10ms (100 campioni a 10KHz) ma il sistema non deve
fare solo acquisizione.. purtroppo.
 Grazie
Giuseppe


grazie mille, do un'occhiata
Giuseppe

 Il timer ha risoluzione di 1ms. A te servono 30ms.
L'oggetto Timer ha una precisione intrinseca di 55 millisecondi,
AFAIR. La funzione Timer va a secondi... per sentito dire credo
gli convenga usare un timer multimediale.
Bye, G.

fare solo acquisizione.. purtroppo.
Io prenderei in considerazione un polling con la GetTickCount.
Io con questo sistema ho fatto un programma in VB per monitorare una
rete di dispositivi in RS485, in cui scrivo su un file le
comunicazioni tra i dispositivi e il tempo che intercorre tra un
messaggio e l'altro e le risposte che arrivano per verificare le
comunicazxioni del sistema.
Considerando che il master, che non è un PC ma un hardware dedicato,
ha una precisione elevata di timing nell'interrogare i dispositivi
periferici, sul mio log vedo sempre tempi di 30 msec tra un messaggio
e l'altro.
Naturalmente il PC non fa altro che ascoltare la seriale e scrivere su
un log, se hai altre applicazioni che girano in contemporanea non si
può fare.
ciao
  Stefano


Fa altro: deve acquisire da una telecamera, blob detection e ricostruzione
3D con le OpenGL. Mi basterebbe un evento del tipo  'OnEndAcquisizione'.
Grazie a tutti.
Giuseppe

 100%.
Per fare animazioni a frame rate costante uso una cosa di questo tipo (da
testare):
' dichiarazioni
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare Function timeGetTime Lib "winmm.dll" () As Long
public moredance as boolean
'  ciclo principale:
Dim gt1 As Long
Dim gt2 As Long
moredance=true
While moredance
    gt1 = timeGetTime
    DoEvents
    [.. fai tutto quel che devi]
    gt2 = timeGetTime
    If gt2 - gt1 < 30 Then
     ' sono passati meno di 30 ms...
     ' faccio passare i millisecondi avanzati
        Sleep 30 - (gt2 - gt1)
    Else
         ' sforato i 30 Ms
        debug.print "'mo sono ca@@i"
    End If
Wend
al QueryUnload del form contenitore (o alla presione di qulche tasto "stop")
devi ricordarti di scrivere
moredance=false
termoPilucco


Grazie mille, faccio delle prove e ti so dire...
Giuseppe

3D con le OpenGL. 
In questo caso auguri!!
ciao 
  Stefano

 In questo caso auguri!!
Grazie, il 3D e l'image processing sono pronte, rimane quella  sopra
(secondo me banale con qualche skill in piů).
Saluti
Giuseppe