Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    14

    [java] prenotazioni quiz

    ciao a tutti! sono un neofiti dello Java. Devo creare un quiz che consiste in un server e un client. Ad ogni lato appartiene un concorrente. Ogni concorrente prima di rispondere deve premere "INVIO" bloccando così l'avversario. Il mio problema è che quando uno si prenota l'avversario non si blocca. Vi invio una parte di codice:

    codice:
    for (int i=1;i<=11;i++){ //Metodo per l'invocazione dell'i-esima domanda this.gd.domanda(i); //Metodo per inviare la domanda al Client this.sock.inviaDomanda(); //Controllo stato prenotazioni while(this.gd.varPrenotazione == 0){ this.conc.controllaPren(); this.sock.controllaPren(); }
    il metodo controllaPren del server è fatto cosi:

    codice:
    public void controllaPren(){ if (this.gd.leggiTastiera().equals("")){ this.gd.varPrenotazione = 1; this.gd.prenotato = "c0"; } }

    Il metodo controllaPren del client è pressochè uguale.
    Il problema è che il programma rimane bloccato in attesa di un input da tastiera fin quando questo non avviene. Vi prego di aiutarmi non so più come fare.
    Grazie mille!

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    14
    cambio la domanda... è possibile mandare in esecuzione un thread e sospenderlo dopo un tot di tempo anche se sta ancora eseguendo??

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    La tua richiesta non mi è molto chiara...

    Il modo migliore per sospendere l'esecuzione di un thread è tramite una variabile booleana che controlla le iterazioni del ciclo (generalmente il while).

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    14
    Ho provato a fare così e anche ad utilizzare la funzione stop(), ma il thread non termina. Posto una parte di nuovo codice che ho scritto, magari è un pò meglio dello schifo che avevo fatto prima

    codice:
    //Metodo per avviare il quiz public void avviaGioco(){ //Richiesta dei nomi dei concorrenti sock.richiediNome(); this.gd.richiediNome(); //ciclo for per effettuare le 10 domande for (int i=1;i<=11;i++){ //Metodo per l'invocazione dell'i-esima domanda this.gd.domanda(i); //Metodo per inviare la domanda al Client this.sock.inviaDomanda(); //Creazione dei Thread di controllo input s = new ControlloSocket(gd,sock,i); t = new ControlloTastiera(gd,i); //Avvio dei Thread s.start(); t.start(); //Attesa per prenotazione concorrente try{ this.gd.semaforoConduttore.acquire(); }catch (Exception e){} //Controllo appartenenza prenotazione, blocco prenotazione avversaria e risposta if (this.gd.prenotato.equals("c0")){ try{ s.interrupt(); }catch(Exception e){} this.sock.prenota(1); this.gd.rispondi(); this.sock.scriviClient(this.gd.s0); this.sock.scriviClient(this.gd.s1); }else{ if(this.gd.prenotato.equals("c1")){ try{ t.interrupt(); }catch(Exception e){} System.out.println("Spiacente, l'avversario si è prenotato"); this.sock.rispondi(); }else{ System.out.println("Tempo scaduto!"); s.interrupt(); t.interrupt(); this.sock.prenota(2); } }
    la run() di ControlloTastiera():

    codice:
    public void run(){ while(!this.isInterrupted()){ try{ if (this.gd.leggiTastiera().equals("")){ this.interrupt(); this.gd.prenotato = "c0"; this.gd.semaforoConduttore.release(); } }catch(Exception e){System.out.println(e);} } }
    e la run() di ControlloSocket():

    codice:
    public void run(){ while(!this.isInterrupted()){ try { if (this.s.leggiClient().equals("prenota")){ this.interrupt(); this.gd.prenotato = "c1"; this.gd.semaforoConduttore.release(); } } catch (Exception e){System.out.println(e); } } }
    penso che il problema sia dovuto al fatto che le funzioni per acquisire da tastiera e dalla socket siano funzioni bloccanti... mi sapreste consigliare? esiste un modo per renderle non bloccanti?

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    PS: Quando posti del codice che richiede più di una riga, NON usare il tasto CODE fornito dalla toolbar del forum, ma apri a mano il tag CODE, incolla il tuo codice e, alla fine, chiudi a mano il tag. Altrimenti il codice viene scritto tutto su una riga (come è successo finora).

    Esempio:

    [CODE]
    qui
    tutto
    il
    codice
    indentato

    [/CODE]


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.