PDA

View Full Version : [Java]misurazioni di intervalli in millisecondi


m.distrutti
08-06-2008, 14:16
per progetto scolastico mi sono ritrovato a realizzare una simulazione di una sfida a rigori tra due squadre di calcio con la concurrency programming in Java

il progetto da me gia ultimato e funzionante va egregiamente con una pecca solo su un punto:

-il monitor Arbitro che gestisce due metodi sincronizzati (Tira per il calciatore e Para per il portiere) dovrebbe controllare due ritardi:

-il calciatore al momento del fischio deve avere un ritardo variabile prima del tiro, se questo ritardo supera i 10ms il tiro viene annullato

-il portiere al momento del fischio prima di buttarsi deve avere un ritardo minimo di 2ms

il ritardo sul calciatore ho pensato di introdurlo con una funzione matematica : (long)(16*Math.random()) che dovrebbe restituirmi un numero compreso tra 0 e 15

con il metodo System.currentTimeMillis() ho notato che mi arrotonda la cifra segnalandomi lo stesso risultato al momento della differenza tra i due momenti(prima del ritardo e dopo): o 0 o 15(0 se il ritardo è compreso tra 0 e piu o meno 7 , e 15 per valori compresi tra 7 e 15) (cercando in internet ho anche scoperto che e' dipendente dal sistema operativo) non consentendomi una misurazione precisa che cerco di effettuare prima di eseguire il ritardo variabile e dopo di questo >_>

in pratica come posso effettuare una misurazione più precisa?cercando in internet ho letto post relativi ad hardware dedicato o addirittura programmazione a basso livello per ovviare a questo problema ma e' ancora cosi?

tra l'altro per il ritardo ho introdotto una sleep pensando che siccome non viene rilasciato il lock sul processo che esegue il metodo sincronizzato(come invece sarebbe accaduto con una wait) sarei stato più preciso nella misurazione, ho aggiunto questa nota per sapere se sbaglio ed eventualmente cosa ihih

vi ringrazio per una eventuale risposta ^_^
Buona giornata a tutti

Josualba84
08-06-2008, 14:57
Ciao!!

Anche io sto facendo il tuo stesso progetto...e come te ho lo stesso problema...oltre a tanti altri...

posso chiederti una cosa??...

...Come hai gestito il portiere??

nuovoUtente86
08-06-2008, 15:23
Una volta calcolato il ritardo ed effettuata la sleep con lo stesso sei perfettamente allineato con la richiesta..in quanto ai fini della valità del tiro basta effettuare un confronto(tra 2 int senza considerare le unita di misura) tra i 10ms stabiliti e il ritardo randomico introdotto.

m.distrutti
08-06-2008, 15:35
Ciao!!

Anche io sto facendo il tuo stesso progetto...e come te ho lo stesso problema...oltre a tanti altri...

posso chiederti una cosa??...

...Come hai gestito il portiere??

scusa il ritardo della risposta

certo non e' stato proprio un metodo elegante ,l'ho tirato giu velocemente dato che non ho molto tempo da dedicarci >_>,

in pratica ho creato due flag

di default i portieri nella mia prima implementazione si buttavano concorrenzialmente nel metodo Para sincrono del monitor e rimanevano in wait affinchè l'arbitro fischiava eseguendo una notifyAll su di essi e dopo aver controllato che la squadra che deve parare sia quella di appartenenza eseguo la parata...

il portiere non deve pero fossilizzarsi su un metodo soltanto perchè dovra waittarsi sia in para che in tira aspettando il fischio dell'arbitro , considera cmq che la squadra iniziale e' casuale percio uno all'inizio si waittera in para e l'altro in tira e si alterneranno

aggiungendo i flag hannoParato e HannoTirato li faccio uscire dal metodo corrente per spostarsi nell'altro

...ora la spiegazione e' un po contorta, se mi lasci il contatto messanger magari per pm ti faccio vedere tutto^_^

Josualba84
08-06-2008, 17:39
Ok...ti ringrazio...ti ho inviato un messaggio privato con il mio contatto...

Grazie!!

^TiGeRShArK^
08-06-2008, 19:58
System.nanoTime() l'hai già provato?
dovrebbe avere una precisione di circa 1ms su xp se non sbaglio...

m.distrutti
08-06-2008, 20:07
System.nanoTime() l'hai già provato?
dovrebbe avere una precisione di circa 1ms su xp se non sbaglio...

sisi alla fine ho guardato quella funzione nell'api e dopo averla provata da una precisazione più dettagliata ^^

grazie mille per le risposte :D