|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Aug 2004
Città: Palermo
Messaggi: 1079
|
Problemi sleep non precisa
Salve a tutti ho un problemino con la sleep e la cattura di determinti istanti di tempo, mi spiego meglio.
Devo catturare ogni 10 ms la posizione del puntatore del mouse e devo segnarmi l'istante di tempo nel quale catturo questa posizione. Ora la semplice Sleep(10) non dorme effettivamente sempre 10ms ma a volte dorme 11, 12 o quello che è ed io devo compensare questo sfasamento. Cioè se io ho un intervallo di 1000ms devo avere 100 catture solo che non riesco in questo risultato, per esempio in 5460 ms ho 543 catture e non 546 (dato dell'ultima cattura). Per cercare di attenuare l'effetto ho provato ad utilizzare queste formule: //attesa iniziale impostata solo una volta attesa=10; //scostamento dall'attesa di 10 ms scost=Tcatturaattuale-Tcatturaprecedente-10; //nuova attesa attesa=attesa-scost Se attesa<0 faccio una Sleep(0) altrimenti una Sleep(attesa). In questo modo la variabile scost mi contiene i ritardi precedenti solo che non riesce mai a recuperare e va sempre in perdita, come posso risolvere il mio problema? Grazie, ciao ciao. |
![]() |
![]() |
![]() |
#2 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Se stai lavorando su Windows, potresti provare con i "Multimedia Timers" (vedi <qui>).
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Aug 2004
Città: Palermo
Messaggi: 1079
|
Si sono su windows, ma per evitare di utilizzare i MultimediaTimers? VOrrei frlo senza andare ad utilizzare altri oggetti.
Grazie, ciao ciao. |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jun 2006
Città: Inverno: Novgorod. Estate: Haifa
Messaggi: 879
|
creati un timer è piuttosto preciso.
__________________
Hosti non solum dandam esse viam ad fugiendum, sed etiam muniendam / Ceterum censeo Carthaginem esse delendam / Et facere et pati fortia romanum est / Nemo Romanorum pacis mentionem habere dignatus est / Roma locuta, causa finita Milla |
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#6 |
Utente sospeso
Iscritto dal: Oct 2002
Messaggi: 2156
|
in unix esiste la nanosleep che garantisce un'accuratezza superiore all sleep.....prova a usare quella (la funzione potrebbe avere un nome diverso....)
__________________
sign editata dallo staff |
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: Jun 2006
Città: Inverno: Novgorod. Estate: Haifa
Messaggi: 879
|
Quote:
Non ricordo il nome, ma se cerchi con timer callback o simili ti salta fuori. PS: certo non parlavo dei timer di cpu, almeno che non possa scendere a livello di kernel, ma dubito che parliamo di sistemi embedded EDIT: purtroppo non ho più ambienti di sviluppo di alcun tipo, quindi vado a memoria sulle esperienze precedenti. Sul DDK c'era un esempio carino su come cadenzare un segnale da driver ad applicazione a precisioni di ms. Putroppo, come detto, non ricordo il nome.
__________________
Hosti non solum dandam esse viam ad fugiendum, sed etiam muniendam / Ceterum censeo Carthaginem esse delendam / Et facere et pati fortia romanum est / Nemo Romanorum pacis mentionem habere dignatus est / Roma locuta, causa finita Milla Ultima modifica di Marco Giunio Silano : 04-10-2006 alle 12:43. |
|
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#11 | |
Senior Member
Iscritto dal: Jun 2006
Città: Inverno: Novgorod. Estate: Haifa
Messaggi: 879
|
Quote:
__________________
Hosti non solum dandam esse viam ad fugiendum, sed etiam muniendam / Ceterum censeo Carthaginem esse delendam / Et facere et pati fortia romanum est / Nemo Romanorum pacis mentionem habere dignatus est / Roma locuta, causa finita Milla |
|
![]() |
![]() |
![]() |
#12 | |
Utente sospeso
Iscritto dal: Oct 2002
Messaggi: 2156
|
Quote:
e allora temo non ci sia altro da fare che usare la gettickcount. Ma sei sicuro che la nanosleep non sia più accurata della sleep? a me pareva di si (ma purtroppo lavoro con win32 e mfc ![]()
__________________
sign editata dallo staff |
|
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
C'è timeSetEvent (usa una callback) ma ritorniamo nei "Multimedia Timer".
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#14 | |
Senior Member
Iscritto dal: Jun 2006
Città: Inverno: Novgorod. Estate: Haifa
Messaggi: 879
|
Quote:
![]() ![]()
__________________
Hosti non solum dandam esse viam ad fugiendum, sed etiam muniendam / Ceterum censeo Carthaginem esse delendam / Et facere et pati fortia romanum est / Nemo Romanorum pacis mentionem habere dignatus est / Roma locuta, causa finita Milla |
|
![]() |
![]() |
![]() |
#15 | |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Per sleep più piccoli puoi solo fare un busyloop, ma può essere fatto dal processo senza nessuna chiamata al s/o. Ovviamente se il task non ha uno scheduling realtime un busyloop può essere interrotto dallo scheduler, e siamo daccapo (con l'aggravio che ora il kernel ci ha bollato come "cpu hog"). Tranne rari casi il busyloop è inutile. Se ti serve un timer preciso, invece che utilizzare il timer di sistema pui utilizzare il driver rtc. Ci sono anche gli hi-res timers, ma non so bene come funzionano. Per Windows ho dato una occhiata alla pagina sui MM Timers, mi sembrano appropriati per questo problema.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 18:30.