Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    327

    Far scambiare variabili a due metodi con override

    Buon giorno ragazzi, ho un problema e spero mi possiate aiutare.
    Ho tre classi, classe A, classe B, classe C.

    codice:
    Classe A{
                Classe B objB = new Classe B(String);
                Classe C objC = new Classe C(javax.swing.JTextArea);
                objB.start(); // Classe B così come classe C estendono Thread
                objC.start();
               }
    Il problema è che nel run che c'è in classe B l'override è fatto in modo che venga riempito un oggetto di tipo BufferedReader e che il run di classe C deve lavorare partendo dai dati presenti in quel buffer.

    Grazie in anticipo a chiunque mi voglia aiutare.

  2. #2
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    327
    In effetti manca la domanda :
    Come faccio a far lavorare la classe B con il buffer che crea la classe C all'interno del suo metodo run?

  3. #3
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    A parte l' errore di sintassi (ma suppongo che A,B,C siano nomi inventati), e il fatto che non so cosa intendi per run ... gli passi quel parametro tramite un metodo getter.

    PS: Ma ti devi spiegare bene, chi non conosce il tuo codice non sa cosa stai tentando di fare.

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    327
    Allora, run è un metodo noto, utilizzabile in quanto le classi B e C estendono Thread, del resto si evince poichè in classe A faccio objB.start() e objC.start() che vanno a richiamare di default il metodo run(). Cerco comunque di essere più chiaro:

    codice:
    Classe A{
                B objB= new obj B;
                C objC= new obj C;
                objB.start();
                objC.start();
                }
    codice:
    Classe B extends Thread{
              String sito;
              public run() throws IOException {
              Process p = Runtime.getRuntime().exec("ping ".concat(sito));
              BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
              }
    La classe C (anch'essa estende Thread) dovrebbe prendere il buffer in, di modo che la run di C possa stampare in un'apposita textarea il suo contenuto ovvero il ping.
    Il problema è che sto cercando di gestire in maniera sincrona il ping e la stampa in una textarea per questo faccio uso dei thread, in particolare il buffer in viene aggiornato continuamente e la stampa dovrebbe essere sicronizzata con questo ping continuo, dovrebbe poter avere accesso continuamente all'oggetto in ma senza per questo effettuare ogni volta la stampa dall'inizio.

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    327
    Anzi, facciamo così ecco direttamente il codice da me creato:

    codice:
    private void Ping(java.awt.event.ActionEvent evt) {
            // TODO add your handling code here:
            DoPing objP=new DoPing(jTextField1);
            PrintPing objPP= new PrintPing(jTextArea1);
            objP.start();
            objPP.start();
        }
    codice:
    public class DoPing extends Thread {
        javax.swing.JTextField jTextField;
        String sito;
        BufferedReader in;
    
        public DoPing(javax.swing.JTextField a) {
            jTextField = a;
        }
        public DoPing(){}
    
        @Override
        public void run() {
            sito=jTextField.getText();
            try{
                Process p = Runtime.getRuntime().exec("ping ".concat(sito));
                in = new BufferedReader(new InputStreamReader(p.getInputStream()));
               }
        catch(IOException e){}
        }
        
        public BufferedReader getPing(){
            return in;
        }
    codice:
    public class PrintPing extends Thread{
        javax.swing.JTextArea jTextArea;
        BufferedReader in;
        DoPing obj=new DoPing();
        public PrintPing(javax.swing.JTextArea a)
        {
            jTextArea=a;
        }
        
        @Override
        public void run()
        {
            in=obj.getPing();
            try {
                String line = null;
                while ((line = in.readLine()) != null) {
                    jTextArea.append(line.concat("\n"));
                }
            } catch (IOException e) {
            }
        }
    }

    Ho provato a eseguirlo nonostante ci sia il problema di cui dicevo sopra ma mi dice:
    Exception in thread "Thread-1" java.lang.NullPointerException
    at tabbled.PrintPing.run(PrintPing.java:29)
    che sarebbe la riga in cui dice
    codice:
    While ((line=in.readLine())!=null){
    ......
    ......
    }

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    327
    Niente continuo a non capire!
    Nessuno mi aiuta perchè forse il problema è stato esposto in maniera poco chiara?
    Cosa posso fare per ricevere un aiuto? Non so più dove sbattere la testa!

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Beh... se più thread devono condividere una risorsa allora c'è solo una strada praticabile:

    1) Si crea la risorsa fuori dai thread (e, possibilmente, prima della loro istanziazione).
    2) Si passa la risorsa a tutti i thread interessati (tramite costruttore o tramite un metodo setter).

    codice:
    public class MioThread_A extends Thread {
       private MiaRisorsaCondivisa mrc;
       public MioThread_A(MiaRisorsaCondivisa mrc) { this.mrc = mrc; }
       ...
    }
    
    ... // stessa cosa per gli altri thread
    
    MiaRisorsaCondivisa resource = new MiaRisorsaCondivisa();
    MioThread_A mtA = new MioThread_A( resource );
    MioThread_B mtB = new MioThread_B( resource );
    ...
    mtA.start();
    mtB.start();
    ...

    La sincronizzazione, poi, spetta a te.

    Spero, almeno, di aver capito giusto il tuo problema...

    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

  8. #8
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    327
    Grazie per la risposta anzitutto.
    Il problema è che la risorsa che devo condividere è un oggetto di tipo BufferedReader che si va riempendo in continuazione, infatti, in questo oggetto va a finire il contenuto di

    codice:
    exec("ping www.google.com")
    ed è noto che quando da terminale si digita [ ping sito ] sia ha un output che non termina mai.

    Provo a spiegare il problema in linea più generale, magari mi puoi suggerire un'alternativa.
    Devo eseguire il ping da e contemporaneamente stampare l'output del ping in una jTextArea.
    In un altro post avevo chiesto una cosa simile, solo che lì l'esigenza era un pò diversa, non avevo necessità di interrompere il ping tramite un apposito pulsante, adesso invece ho questa necessità e con quel codice non c'è verso.
    Voglio avere la possibilità di interrompere il ping e conseguentemente quando il buffer si sarà svuotato anche la stampa avrà fine.

  9. #9
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    327
    Niente ho continuato a sbatterci la testa ma senza esito.. non so più che fare.. nessuno può aiutarmi?

  10. #10
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Io non ho ancora capito a che ti servono due thread.
    Io lancerei il ping in un thread che controlla tutto il lavoro del processo.
    Il thread ottiene l'istanza di Process del comando ping e continua a leggere dal suo InputStream finchè non accade qualcosa voluto dall'utente.

    Questo è un esempio banale, spero ti sia di aiuto per quello che intendi tu (lascia perdere la gestione delle eccezioni, è fatta veramente in modo molto ridotto):

    codice:
    import java.io.*;
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    
    public class MioPing extends JFrame implements ActionListener {
    
       private class PingThread extends Thread {
          private Process p;
          public PingThread() {
             p = null;
          }
    
          @Override
          public void run() {
             try {
                String[] cmd = {"ping", "192.168.1.15", "-t"};
                p = Runtime.getRuntime().exec( cmd );
                BufferedReader br = new BufferedReader( new InputStreamReader(p.getInputStream()) );
                String linea = null;
                while(!isInterrupted() && ((linea = br.readLine()) != null)) {
                   txtPing.append(linea + "\n");
                }
                br.close();
                p.destroy();
             } catch (Exception e) { e.printStackTrace(); }
          }
       }
    
       private JTextArea txtPing;
       private JButton cmdPing;
       private PingThread pThread;
       private boolean ferma;
    
       public MioPing() {
          ferma = false;
    
          Container c = getContentPane();
          c.setLayout( new BorderLayout() );
          
          txtPing = new JTextArea();
          cmdPing = new JButton("Avvia ping");
          cmdPing.addActionListener( this );
    
          JPanel jpFondo = new JPanel( new FlowLayout(FlowLayout.CENTER, 10, 10) );
          jpFondo.add( cmdPing );
    
          c.add(txtPing, BorderLayout.CENTER);
          c.add(jpFondo, BorderLayout.SOUTH);
    
          setSize(800, 600);
          setTitle("Prova ping");
          setDefaultCloseOperation( EXIT_ON_CLOSE );
          setVisible( true );
       }
    
       public void actionPerformed(ActionEvent ae) {
          if ( ferma ) {
             pThread.interrupt();
          } else {
             pThread = new PingThread();
             pThread.start();
          }
          ferma = !ferma;
          cmdPing.setText( ferma ? "Ferma ping" : "Avvia ping" );
       }
    
       public static void main(String[] args) {
          MioPing mp = new MioPing();
       }
    }
    Nell'esempio viene lanciato il comando ping verso l'indirizzo 192.168.1.15 (e, siccome l'ho provato su Windows, ho anche dovuto inserire l'opzione "-t" altrimenti si ferma dopo 4 ping).

    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.