Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    137

    L'interfaccia si blocca

    Buongiorno a tutti,

    ho un problema :
    ho un'interfaccia grafica con un bottone che mi manda in esecuzione un programma dos esterno tramite runtime
    ...
    ...
    {
    jButton1 = new JButton();
    this.add(jButton1);
    mess1=new JLabel();
    this.add(mess1);
    jButton1.setText("OK");
    jButton1.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
    try{
    pexecute pe = new pexecute();
    Process p1 = Runtime.getRuntime().exec("programma "+namedataset);
    pe.execute(namedataset,mess1);

    Process p2 = Runtime.getRuntime().exec("programma2 "+mess1.getText());
    } catch (Exception e) {
    e.printStackTrace();}
    }
    });
    }

    ...
    ...
    public class pexecute {

    class StreamGobbler extends Thread
    {
    private JLabel mess1;
    private String namedataset;
    public StreamGobbler(String namedataset,JLabel mess1)
    {
    this.mess1=mess1;
    this.namedataset=namedataset;
    }
    public void run()
    {
    try
    {
    mess1.setText("Wait...");
    InputStreamReader isr = new InputStreamReader(proc.getInputStream());
    BufferedReader br = new BufferedReader(isr);
    if((line=br.readLine())!=null){
    mess1.setText(line);
    }
    } catch (IOException ioe)
    {
    ioe.printStackTrace();
    }
    }
    }
    public void execute(String namedataset,BigDecimal rho,JLabel mess1){
    try{
    StreamGobbler executeGobbler = new StreamGobbler(namedataset,mess1);
    executeGobbler.start();
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }
    ...
    ...
    il problema è questo:
    devo aspettare che il processo p1 finisca visto che mi serve il valore che andra a scrivere sulla JLabel mess1 per eseguire il processo p2.
    Ho provato più metodi per risolvere il problema
    1. prima di process p2 scrivere qualcosa del genere p1.waitfor();
    2. modificare la funzione pexecute in modo che implementa Callable() e con una variabile Future aspetto l'uscita del valore desiderato.

    Il problema è che con questo tipo si soluzioni la mia interfaccia si blocca (il pulsante OK rimane premuto e non posso effettuare nessun'altra operazione durante l'esecuzione di p1).
    Come evitare questo?

    Grazie in anticipo a tutti

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

    Re: L'interfaccia si blocca

    Originariamente inviato da Macgiglio
    1. prima di process p2 scrivere qualcosa del genere p1.waitfor();
    Che è sbagliato perché stai bloccando il EDT.

    Originariamente inviato da Macgiglio
    2. modificare la funzione pexecute in modo che implementa Callable() e con una variabile Future aspetto l'uscita del valore desiderato.
    Se attendi anche qui il risultato in modo "sincrono", blocchi comunque lo stesso il EDT.

    Originariamente inviato da Macgiglio
    devo aspettare che il processo p1 finisca visto che mi serve il valore che andra a scrivere sulla JLabel mess1 per eseguire il processo p2.
    Se è questo quello che vuoi, allora devi cambiare un po' le cose. In actionPerformed() dovresti creare un tuo thread (lascia perdere StreamGobbler & company) al cui interno, stavolta in modo "sincrono", lanci il processo, leggi il suo output, attendi la fine ecc....
    E quando avrai finito o comunque quando devi mostrare qualcosa, lo devi fare nel contesto del EDT, quindi usando SwingUtilities.invokeLater().



    P.S. Tra l'altro StreamGobbler, che è un thread a parte, non è proprio correttissimo .... vengono fatti dei setText() sulla label .... che è sbagliato perché tale operazione andrebbe fatta solo nel contesto del EDT, non da un qualunque altro thread.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320

    Moderazione

    @Macgiglio: c'è un regolamento in ogni area del forum. E' sempre fra i thread in evidenza. Bisogna leggerlo prima di postare... ora, dal numero di post che hai non mi sembra che tu sia proprio nuovo nuovo... quindi, che ne dici di applicare quanto scritto al punto 6 del suddetto regolamento?


    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

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    137
    Scusate....

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    137
    Fatto, ma ho lo stesso problema.....

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    137
    ho scritto qualcosa del genere
    codice:
    {
      jButton1 = new JButton();
      this.add(jButton1);
      mess1=new JLabel();
      this.add(mess1);
      jButton1.setText("OK");
      jButton1.addActionListener(new ActionListener() {
     public void actionPerformed(ActionEvent evt) {
        try{
    
            Runnable processexecute = new Runnable() {
    	   public void run() {
    	      try  {   
    		Process p1 = Runtime.getRuntime().exec("programma "+namedataset); 
                    mess1.setText("Wait...");
    	        InputStreamReader isr = new InputStreamReader(p1.getInputStream());
    	        BufferedReader br = new BufferedReader(isr);
    		if((line=br.readLine())!=null){
    		    mess1.setText(line);
    		            	}
    	            } catch (IOException ioe)
    			  {
    			      ioe.printStackTrace();
    			         		              }		            
    			            	     }
    			            	 };
              SwingUtilities.invokeLater(processexecute);
               Process p2 = Runtime.getRuntime().exec("programma2 "+mess1.getText());
    	} catch (Exception e) {
    	e.printStackTrace();}
    				        }
    				});
    			}
    }
    }
    anche se il tutto funziona ho il solito blocco

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Macgiglio
    ho scritto qualcosa del genere

    anche se il tutto funziona ho il solito blocco
    Che purtroppo è tutto sbagliato. Perché il "lavoro" lo fai eseguire comunque nel EDT!!! E quindi il blocco c'è lo stesso.
    E oltretutto il run() di quel Runnable viene eseguito dopo che actionPerformed() è terminato, quindi quando lanci p2 non puoi di certo avere qualcosa di utile nella label.

    Il tuo lavoro non devi farlo eseguire nel EDT. Devi farlo eseguire nel contesto di un altro thread (estendi Thread o implementa Runnable e istanzia un Thread con il Runnable) e poi solo quando devi accedere ai componenti della interfaccia allora usi invokeLater() per accedere al/ai componente/i.
    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.