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
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