Newsgroup: it.comp.java
Titolo: Far partire contemporaneamente + Thread

Salve a tutti. ho il seguente problema.
Sto realizzando un mezzo giochino su rete, dove i concorrenti accedono al
server e digitano i loro nomi.
Quando sono tutti correttamente entrati devo trovare il metodo per far
scattare tutti insieme i giocatori e quindi dare loro la possibilità di
partire.
Per ora ho provato a mandare a tutti il segnale di start, ma probabilmente
c'è qualche ritardo e i Thread (le prove per ora le faccio sul locale) non
partono tutti contemporaneamente.
Come posso fare?
Come sempre, grazie mille in anticipo a tutti.

 wrote in message
news:acir1v$108c$
1...@stargate1.inet.it

-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 faccio sul locale) non partono tutti contemporaneamente.
ti avverto non l'ho mai fatto ma cosi la prima cosa che mi viene in mente 
e'non puoi raggruppare i thread in un gruppo e poi far partire il gruppo 
cosi i thread apparteneti al gruppo dovrebbero partire tutti assieme...
prova un po' a documentarti in proposito 
   bEPpE 

Puoi renderli eseguibili (mettendoli in un ThreadGroup e richimando il
metodo start() sul gruppo) contemporaneamente ma non possono essere messi in
esecuzione contemporaneamente.
Prova a descrivere il gioco magari qualcuna penserà a qualche altra
soluzione.

 thread per ogni utente? Puoi specificare meglio il problema?
Stavo studiacchiando i Socket e ho detto... Invece di fare la solita chat,
faccio una corsa di cavalli, tipo vecchio gioco in piano per 8086, dove i
giocatori devo premere velocemente il tasto invio.
Hai presente quei vecchi giochi massacra tastiere?
Il server accetta 4 client. Dopo che ha accettato i client (quindi i Thread
dei client sono già realizzati e partiti ma tenuti buoni mediante un
booleano), fa partire un il suo thread, che verifica che tutti i client
abbiano notificato il loro nome (i client come prima cosa, alla partenza,
chiedono il nick del corridore).
Quando questo avviene il thread muore, ma prima di suicidarsi, lancia la
partita, notificando a tutti un comando <START>.
I client lo intercettano e danno vita alla corsa.
Io pensavo che questo fosse tutto in real-time, ma ho notato che neanche
portando a due i client riesco ad avere una certa contemporaneità tra i due
Thread.
Sto rosicando come una bestia.
Probabilmente è più un problema di qualche cacchiata che faccio io, ma per
ora sono bloccato :'(
Addio corse di cavalli a zunzolo e personaggi improbabili :'((((((((((
sigh!!!!
Ciao e grazie mille.

Per maggiori info, guarda il mio RE-Post a Mauro Sensoli, quì sopra.



> Io pensavo che questo fosse tutto in real-time, ma ho notato che neanche
pensavi male :). Come i tread vengono lanciati è lasciato
all'implementazione della virtual machine ed il dialogo tra i thread
delegato al S.O. Se,ad esempio, usi Winsozz parlare di real time è solo
fantasia.
L'esecuzione dei thread non è poi mai contemporanea, a patto di non
usare particolari macchine multiprocessore. Se hai un unico processore i
processi sono esguiti uno di seguito l'altro secondo l'algoritmo di
schedulazione dei processi del S.O.
Francamente non so se esiste qualche particolare estensione di Java che
permette di fare real time decentemente. Potrebbe essere interessante
aprire un thread (scusate il gioco di parole) su questo argomento.
Ritornando al tuo problema: 
il fatto che i client non ricevano non credo si un problema:
Dopo avere lanciato il comando di Start potresti fare elaborare la
velocità media di pressione dei tasti, calcolarti lo spazio percorso e
quando un utente è arrivato sarà il server a capire chi ha impiegato
meno(il client invia il tempo relativo). Se vuoi fare il fine puoi
aumentare il traffico tra server e client prendendo il tempo intermedio
e rimandando ad ogni client la classifica relativa. 
Se ti sembra una soluzione sensata fammi sapere.
Ciao,
Mauro Sensoli


Potresti prendere il momento d'inizio corsa per ognuno dei thread(inizio del
metodo run()) con il metodo long inittime = System.currentTimeMillis() e
sottrarlo con il momento in cui finisce la corsa del thread (fine del metodo
run()), rimarerebbero comunque i soliti problemi della gestione dei thread.
Potresti inoltre settare i thread dei concorrenti con una priorità maggiore
del thread che aggiorna la grafica.
E' un'idea probabilmente andrebbe sviluppata meglio...ciao.

Forse la maggior parte dei problemi dipendono dal fatto che sto facendo
partire i thread tutti sulla stessa macchina.
Cmq. sembra che ci sia riuscito. Sincronizzando i punti giusti dei thread
del server (quelli che il serve usa per ricevere informazioni dai
corridori ), li tengo fermi fino a quando il thread che controlla la
notifica dei nick da parte di tutti i corridori (se sono arrivati fono a
quel punto, sia l'aspetto grafico, che tutto quello che mi serve per i
corridori è già inizializzato, quindi non ho problemi di caricamento delle
immagini etc.), quando sono certo che tutti sono arrivati, sblocco i thread
notificando l'oggetto sincronizzato.
Premetto che ho anche abbassato la priorità dei vari thread mettendola al
minimo.
Farò altre prove, ma in linea di massima sembra andare.
E' essenziale che tutti possano partire quasi contemporaneamente. Non è
bello vedere gli altri partire, mentre il tuo contatore ti sta dando ancora
il [3,2,1,go!!], mi sembra sleale e anche pò bastarda come cosa, non trovate
? ;)
Ciao a tutti.

 e rimandando ad ogni client la classifica relativa.
Penso anche io che questa sia una possibile soluzione, anche perchè devi
tenere presente la latenza della rete. Anche se la jvm potesse far partire
due
thread contemporaneamente su una macchina multiprocessore, il comando
di start arriverebbe agli host in tempi diversi.
Ciao!
--
Psychotron / icq 9548860