Newsgroup: it.comp.lang.visual-basic
Titolo: uso dei timers multimediali.

Qualcuno ha utilizzato timers multimediali o ha un po' di codice ad hoc?
grazie.


Io mi sto "divertendo" con gli MMtimers. Non sono niente di particolarmente
complicato!
Se ti fa comodo, puoi usare queste due funzioni che ho scritto. Ovviamente
includi le
declare di "timeSetEvent", "timeKillEvent" e "TIME_PERIODIC" che ottieni
dall'API Viewer.
Public Function mmtimerCreate(Period As Long, CallbackAddress As Long) As
Long
    '
    ' Crea e abilita un timer multimediale. Il periodo è impostato (in ms)
mentre la
    ' risoluzione (precisione) è impostata a 0& = massima.
    ' CallbackAddress è il risultato di AddressOf
    ' Se l'operazione ha successo, restituisce l'handle al timer, altrimenti
0.
    '
    mmtimerCreate = timeSetEvent(Period, 0&, CallbackAddress, 0&,
TIME_PERIODIC)
    '
End Function
Public Sub mmtimerDelete(mmtHandle As Long)
    '
    ' Distrugge e disabilita un timer multimediale
    '
    Call timeKillEvent(mmtHandle)
    '
End Sub
La funzione che viene richiamata dal timer è (ad esempio)
Public Sub Callback(ByVal uTimerID As Long, ByVal uMsg As Long, ByVal dwUser
As Long, ByVal dw1 As Long, ByVal dw2 As Long)
    '
    ' codice di Callback     '
End Sub
e deve essere inserita in un modulo, non in un form!
P.S. attenzione: non puoi lasciare andare un timer mentre breakki il codice,
altrimenti ottieni un bell'errore di protezione. Inoltre non provare ad
esagerare con i periodo, sotto gli 8-10 ms (su un PII 266) si hanno dei
"simpatici" side-fx, divertenti da vedere una volta, ma noiosi (occorre
resettare hardware il computer).
Saluti, Max
P.S. suppongo che usi VB5, poichè è indispensabile l'operatore AddressOf!


purtroppo devo utilizzare i timers mm per una routine da eseguire 25 volte
al secondo, che
manipola grafica et alii. A volte funziona, a volte no, comunque in entrambi
i casi dopo poco
tempo mi si blocca con "immancabile" reset del computer. non mi sembra
sinceramente
che la routine impieghi piu' di 40 ms ad essere eseguita, e comunque, sotto
suggerimento,
ho posto un flag che verifichi il fatto che si stia eseguendo una vecchia
routine, e se affermativo
esca. purtroppo tutto questo non ha portato grossi benefici....
attendo trepidante suggerimenti.


i casi dopo poco...
Mi sembra strano, io uso gli mmTimer per chiamare un funzione che
plotta fino a 16 curve e questa viene chiamata circa 30 volte al secondo,
senza
problemi, tenendo conto che, nel frattempo il prg:
1. legge un buffer da un scheda AD (acquisico fino a 16 canali a 1kHz a 16
bit)
2. converte i dati da binario in float, li scala
3. applica fino a 6 funzioni DSP sui dati per ogni canale
4. scarica i dati su disco
5. interagisce con l'utente.
Comunque ho dovuto sudare un po' in quanto se la funzione che chiami
ci mette troppo, e' facile che il prg si impalli. Magari cerca di richiamare
meno volte la callback, facendogli però fare più cose ad ogni chiamata,
ad esempio io plotto un totale di 125 samples/s per canale, plottandone 4
per ogni callback del timer multimediale. A occhio non si vede differenza
tra 125 chiamate che plottano 1 campione 1 e 30 chiamate che ne plottano
4 però in uno modo occupo la CPU circa il 30%, nell'altro il 60-70% ;-)))
INOLTRE stai attento a SINCRONIZZARE i vari processi che generano/consumano
dati. Win95/98/NT hanno delle belle funzioni apposite per la generazione dei
mutex (che in pratica sono dei semafori) e dei semaphores (che sono dei
semafori generalizzati). Ho recuperato del codice dal testo di Zicari di
"Sistemi
Operativi" del Poly che girava in C e funziona alla grande (una volta
tradotti i
termini dallo Zicarese al Microsoftano...).
Purtroppo senza ulteriori dettagli non so come aiutarsi.
Saluti, Max.
P.S. non perdere tempo a simulare i mutex/semaphore con del codice VB,
per funzionare le due funzioni devono essere atomiche, altrimenti non sono
dei mutex/semaphore, e creare del codice atomico in un ambiente preempitive
senza supporto dall'OS è impossibile.