Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2003
    Messaggi
    232

    [java] controllo Thread

    Salve a tutti...sto lavorando ad un programma...questo programma è composto da un main che una volta lanciato crea un'applet in cui inserire (in un TextField) una username...alla pressione del bottone "conferma"...viene fatto partire un thread che apre una Finestra (Frame) con all'interno la stampa della username precedentemente digitata...e questo avviene per gli n "utenti" che inseriscono una username e cliccano su "conferma"...ne segue che vengono create n finestre...adesso quello che voglio fare è questo...voglio che quando 2 utenti hanno inserito la loro username e si sono aperte le loro relative finestre...voglio mandare su tutte e due le finestre un messaggi di benvenuto!...ATTENZIONE PERO'...voglio inviare tale messagggio solo quando il secondo utente ha fatto partire la sua finestra...fondamentalmente và controllato (credo ciclicamente) quando un eventuale contatore delle istanze delle finestre è uguale a 2 e a quel punto stampare sto messaggio...è possibile fare tutto cio? qualche esempio? Grazie a tutti!

  2. #2
    Ciao...si può fare come hai detto tu più o meno!
    Se utilizzi la classe thread puoi fare in modo che il thread della finestra che si apre per primo dopo aver stampato l'username si metta in attesa usando il metodo wait().
    Poi quando si apre anche la seconda finestra le fai stampare l'username e il messaggio di benvenuto seguito da un notifyAll() così da risvegliare il thread dell'altra finestra che a sua volta stamperà il messaggio di benvenuto...
    Si può vincere o perdere, l'importante è vincere o perdere da uomini...

    Neverland - Il mio Forum

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2003
    Messaggi
    232
    Grazie...buon metodo!

  4. #4
    beh è il metodo più efficente secondo me...cmq dai un'occhiatina alla documentazione della classe thread

    Ciao.
    Si può vincere o perdere, l'importante è vincere o perdere da uomini...

    Neverland - Il mio Forum

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2003
    Messaggi
    232
    Ciao Matteo982....riflettendo sulla tua risposta mi viene un'altra domanda...come faccio a sapere quante istanze di finestre sono state aperte??? cioè come faccio a dare alla prima istanza il metodo wait() e poi dare il notifyAll()???

    considerando che il codice del thread è pressapoco così

    codice:
    class ThreadClient extends Thread {
          FinestraChat fc;
          
          
          ThreadClient(FinestraChat fc) {
              this.fc = fc;
          }
    
      public void run() {
        try {
    .
    .
    .} 
    catch (IOException ioe) {}
        super.run();
      }
    
    come faccio a distinguere e/o capire la prima finestra e la seconda? sono stato chiaro...?

  6. #6
    dove lo lanci il thread? Al momento della creazione del thread puoi passare un nome che rappresenta quel thread che crei quindi puoi creare un nome per la prima finestra e uno diverso per la seconda in modo da poterli distinguere

    ad esempio:

    new ThreadClient(prima).start()

    o usando un for per chiamarli 1 e 2 o cmq poi vedi come preferisci tu, la cosa principale è che con il nome poi li puoi distinguere. Se non metti niente, quindi:

    new ThreadClient().start()

    Al thread viene dato un nome in automatico però poi tu non lo sai e quindi è un po' un casino!
    Si può vincere o perdere, l'importante è vincere o perdere da uomini...

    Neverland - Il mio Forum

  7. #7
    Utente di HTML.it
    Registrato dal
    Aug 2003
    Messaggi
    232
    ...infatti...adesso uso

    codice:
    (new ThreadClient(this)).start();
    quindi mi consigli di mettere "primo" e poi "secondo"....quindi semplici stringhe...

  8. #8
    Utente di HTML.it
    Registrato dal
    Aug 2003
    Messaggi
    232
    scusa...sono andato nel pallone...come si fa?

    per ora ho così

    codice:
    (new ThreadClient(this)).start();
    
    e poi
    
    class ThreadClient extends Thread {
          FinestraChat fc;
          
          
          ThreadClient(FinestraChat fc) {
              this.fc = fc;
          }
    
      public void run() {
        try {
    .....
    come devo mettere per distinguere??

  9. #9
    prima di tutto tu usi un costruttore della classe ThreadClient fatto da te in cui gli passi il Frame quindi per creare il thread devi fare così:

    codice:
    (new ThreadClient(FinestraChat fc)).start();
    altrimenti non ti riconosce il costruttore della classe e non te lo compila. A questo punto puoi semplicemente aggiungere al costruttore una variabile col nome del thread così lo puoi distinguere:

    codice:
    class ThreadClient extends Thread {
          FinestraChat fc;
          String nome;
          
          
          ThreadClient(FinestraChat fc, String nome) {
              this.fc = fc;
              this.nome = nome;
          }
    
      public void run() {
        try {
    .
    .
    .} 
    catch (IOException ioe) {}
        super.run();
      }
    e la chiamata del thread diventa qualcosa tipo:

    codice:
    (new ThreadClient(FinestraChat fc, nome)).start();
    poi i nome dove tirarlo fuori lo devi vedere tu che hai tutto il programma sotto mano.

    A questo punto nel metodo fun del thread ci metti una cosa del genere:

    codice:
    if (nome = "seconda finestra")
    {
         notifyAll(); 
    }
    else
    {
         wait();
    }
    così il primo thread va a fare il wait mentre il secondo entra nell'if e risveglia il primo.
    Si può vincere o perdere, l'importante è vincere o perdere da uomini...

    Neverland - Il mio Forum

  10. #10
    Utente di HTML.it
    Registrato dal
    Aug 2003
    Messaggi
    232
    Intanto ti ringrazio per le risposte...non ho ancora ben capito come fare a fargli distinguere il nome per ogni thread diverso...nel senso che dovrebbe essere un qualcosa esterno alla classe a dare il nome al thread? o in qualche modo dalla classe stessa è possibile controllare il primo thread che è partito e dargli un nome, ed al successivo darne un altro? in secondo luogo ho avuto problemi con il wait() ed il notifyAll()....uno dei due (credo il wait()) mi solleva un'eccezione di IllegalMonitorStateException...
    ti posto il codice della mia FinestraChat... mi potresti indicare i punti in chi eseguire le correzioni? Grazie tante...

    codice:
    import java.awt.*;
    import java.awt.event.*;
    import java.io.*;
    import java.util.StringTokenizer;
    
    public class FinestraChat extends Frame {
      TextArea taNomi = new TextArea();
      TextField tMessaggio = new TextField();
      TextArea taChat = new TextArea();
      Button button1 = new Button();
      Image[] img = new Image[5];
      int x,y;
      TextArea path = new TextArea();
          
      public FinestraChat(String titolo) {
          this();
          setTitle(titolo);
      }
    
      public FinestraChat() {
        try  {
          jbInit();
        }
        catch (Exception e) {
          e.printStackTrace();
        }
      }
    
      private void jbInit() throws Exception {
      	
        this.setBackground(new Color(0, 192, 0));
        this.setSize(new Dimension(571, 935));
        this.setTitle("Finestra di Accesso");
        this.setLocation(0,0);
        this.setLayout(null);
        taNomi.setBackground(Color.white);
        taNomi.setFont(new Font("TimesRoman", 0, 14));
        taNomi.setBounds(new Rectangle(453, 29, 107, 400));
        tMessaggio.setBackground(Color.white);
        tMessaggio.setBounds(new Rectangle(18, 438, 533, 33));
        taChat.setBackground(Color.white);
        taChat.setFont(new Font("TimesRoman", 1, 14));
        taChat.setBounds(new Rectangle(11, 28, 437, 401));
        button1.setFont(new Font("TimesRoman", 1, 14));
        button1.setBounds(new Rectangle(211, 473, 115, 43));
        button1.setLabel("Invia");
        button1.addActionListener(new java.awt.event.ActionListener() {
          public void actionPerformed(ActionEvent e) {
            button1_actionPerformed(e);
          }
        });
    
        this.add(taNomi, null);
        this.add(tMessaggio, null);
        this.add(taChat, null);
        this.add(button1, null);
        //this.add(path, null);
        
        //variabile che "dovrebbe" contenere il nome del thread
        String nomeThread = null;
        
        new ThreadClient(this, nomeThread).start();
        tMessaggio.requestFocus();
      }
    
      public void paint(Graphics g) {
      	if (img[0]!=null)
      		g.drawImage(img[0],40,550,img[0].getWidth(null),img[0].getHeight(null), this);
      	if (img[1]!=null)
      		g.drawImage(img[1],40,750,img[1].getWidth(null),img[1].getHeight(null), this);
      }
     
      void button1_actionPerformed(ActionEvent e) {
        try {
        if (!tMessaggio.getText().trim().equalsIgnoreCase("")) {
            ChatClient.os.writeBytes(tMessaggio.getText()+"\n");
            tMessaggio.setText("");
          }
        } catch (IOException ioe) {System.out.println("Errore = "+ioe);}
        tMessaggio.requestFocus();
      }
    }
    
    class ThreadClient extends Thread {
          FinestraChat fc;
          String nomeT;
          
          
          ThreadClient(FinestraChat fc, String nomeT) {
            this.fc = fc;
            this.nomeT = nomeT;
          }
    
      public void run() {
        try {
          while (true) {
            String str = ChatClient.is.readLine();
            if (str == null) break;
            if (str.substring(0,1).equalsIgnoreCase("U")) {
                fc.taNomi.setText("");
                StringTokenizer toke = new StringTokenizer(str.substring(1),">");
                while (toke.hasMoreElements()) {
                	//aggiunge la nuova userId all'elenco Utenti nella Finestra CHAT
                	fc.taNomi.setText(fc.taNomi.getText()+toke.nextToken()+">"+"\n");
                }
            }
            else if (str.substring(0,1).equalsIgnoreCase("T")) {
            	//se entriamo qui significa che si tratta di un nuovo Messaggio lasciato da un utente
                fc.taChat.setText(fc.taChat.getText()+str.substring(1)+"\n");
            }
            
            else if (str.substring(0,1).equalsIgnoreCase("I"))  {
            	        	
    
            	//Qui mi server il WAIT del Thread
            	
            	
            	
            	
            	StringTokenizer toke = new StringTokenizer(str.substring(1),"-");
            	int i=0;
            	while (toke.hasMoreElements()) {
                	
                	String tempTok = toke.nextToken();
                	
                	System.out.println(tempTok);
                	
                	fc.img[i] = Toolkit.getDefaultToolkit().createImage(tempTok.substring(0,tempTok.indexOf("_")));
                	i++;
                }
            }
            
          }
       } catch (IOException ioe) {}
        super.run();
      }
    }

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.