Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    396

    applet: interrompere ciclo infinito

    Ciao a tutti.
    Ho creato una applet che riceve dei pacchetti in codice binario, vi incollo il corpo centrale:

    codice:
    class client implements ActionListener {
    public void actionPerformed(ActionEvent e1) {
    try {
            String source = null;
            PacketSource reader;
    
    
            if (source == null) {
      	  reader = BuildSource.makePacketSource();
            }
            else {
      	  reader = BuildSource.makePacketSource(source);
            }
    	if (reader == null) {
    	    System.err.println("Invalid packet source (check your MOTECOM environment variable)");
    	    System.exit(2);
    	}
              //Connessione al flusso di dati
    	  reader.open(PrintStreamMessenger.err);
    	  for (;;) {                                             //Ciclo infinito che mi blocca la applet 
    	    byte[] packet = reader.readPacket();
                int i=0;
                jTextArea1.append("Server:"+hexString(packet)+" \n");  // stampa sulla jTextArea
    	    Dump.printPacket(System.out, packet);//stampa sul terminale il flusso di dati
    
    	    System.out.println();
    	    System.out.flush();
    	  }
    
    }
    catch(Exception e) {
    System.out.print("Whoops! It didn't work! \n");
    e.printStackTrace();
      }
     }
    }
    Il mio problema è che quando premo il tasto connetti la applet si collega ed il bottone(connetti) rimane premuto fino a quando non interrompo il flusso di dati dall'altro programma da cui riceve i pacchetti.
    Inoltre i dati non vengono stampati sulla jTextArea1 sempre se prima non ho interrotto la comunicazione dall'altro programma.
    Come potete vedere uso un ciclo infinito: for(;
    Forse devo cambiarlo con qualcosa di più idoneo...

    Vi ringrazio anticipatamente dell'aiuto.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: applet: interrompere ciclo infinito

    Originariamente inviato da Salinas
    Il mio problema è che quando premo il tasto connetti la applet si collega ed il bottone(connetti) rimane premuto fino a quando non interrompo il flusso di dati dall'altro programma da cui riceve i pacchetti.
    Inoltre i dati non vengono stampati sulla jTextArea1 sempre se prima non ho interrotto la comunicazione dall'altro programma.
    Come potete vedere uso un ciclo infinito: for(;
    Forse devo cambiarlo con qualcosa di più idoneo...
    Approccio concettualmente sbagliato.
    -> Threads and Swing

    Anche dal tutorial Sun: Concurrency in Swing
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    396
    Non esistono guide in italiano su questa materia???
    Visto che non conosco l'argomento mi rimane più difficile capirlo in inglese che in italiano.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Salinas
    Non esistono guide in italiano su questa materia???
    Probabilmente esistono anche articoli/tutorial in italiano .... ma non ho link da darti al momento.
    Comunque lo sai sicuramente bene anche tu: se non hai una conoscenza, anche minima, di inglese che ti permetta di leggere almeno della documentazione "tecnica", sei "tagliato" fuori dal 90% della documentazione più utile e aggiornata. Fai le tue considerazioni ....

    Originariamente inviato da Salinas
    Visto che non conosco l'argomento mi rimane più difficile capirlo in inglese che in italiano.
    Il succo è semplice: la gestione delle interfacce grafiche AWT/Swing è basata su un unico thread chiamato convenzionalmente EDT (event dispatch thread). Questo è il thread che si occupa, tra le altre cose, di "disegnare" la interfaccia utente e di dispacciare gli eventi ai listener. Cioè c'è un unico "flusso" di esecuzione che di tanto in tanto un po' aggiorna la interfaccia, un po' dispaccia gli eventi, fa altro, ecc...

    I metodi dei listener (es. actionPerformed()) sono invocati nel contesto del EDT. Se ti metti ad impegnare tu il EDT (con operazioni lunghe, I/O "bloccante", cicli, sleep() o roba del genere), il controllo non può certo tornare di nuovo al framework, che quindi non può aggiornare nulla a video e nemmeno dispacciare altri eventi. La tua interfaccia è "congelata". Punto.

    Devi fare operazioni lunghe? Devi eseguirle in un thread separato, con un "normale" Thread o con un SwingWorker. Con tutto ciò che ne consegue, in particolar modo per quanto riguarda l'aggiornamento della interfaccia utente. Già, perché salvo pochi casi (e ben documentati), l'accesso a qualunque componente della interfaccia utente va fatto solo ed esclusivamente nel contesto del EDT.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    396
    Posso mettere altri thread dentro questo principale?

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Salinas
    Posso mettere altri thread dentro questo principale?
    Il "dentro" non dice nulla .... devi creare un altro thread se devi eseguire operazioni lunghe.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    396
    Se qui:
    codice:
      public void init() {
            try {
                java.awt.EventQueue.invokeAndWait(new Runnable() {
                    public void run() {
                        initComponents();
               jButton1.addActionListener(new client());
             //  jTextArea2.addKeyListener(new invio());
    
                    }
                });
            } catch (Exception ex) {
                ex.printStackTrace();
            }
    
        }
    Al posto di jButton1.addActionListener(new client()); ci metto un altro thread come initComponents() per aspettare la pressione del tasto connetti e quindi per far eseguire il ciclo for, va bene?
    Oppure ne devo creare uno nuovo, diverso da invokeAndWait()?

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Salinas
    Al posto di jButton1.addActionListener(new client()); ci metto un altro thread come initComponents()
    No inizializza la gui è basta. A seguito di un evento es. click su pulsante, nel actionPerformed andrai ad istanziare un Thread e lo farai poi partire.

    Guarda tra i miei Java Examples (vedi firma), sezione AWT/Swing - Concurrency

    Originariamente inviato da Salinas
    Oppure ne devo creare uno nuovo, diverso da invokeAndWait()?
    invokeAndWait/invokeLater servono solo per "richiedere" che il codice nel run() del Runnable venga eseguito nel contesto del EDT.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    396
    Non mi puoi fare un esempio sul mio codice così lo capisco meglio?
    Grazie

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Salinas
    Non mi puoi fare un esempio sul mio codice così lo capisco meglio?
    Grazie
    Nel init() della applet generalmente si mette solo il try-catch con dentro l'invocazione di invokeAndWait() con un run() che invoca un metodo statico es. initGui() o come vuoi chiamarlo. Tutto qui.

    Nel actionPerformed(), che sarà da qualche altra parte, istanzi un Thread e lo fai partire. E ripeto: ci sono esempi sul mio sito.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.