Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    137

    Chiudere processo esterno

    Ciao a tutti...
    vorrei saper un metodo per chiudere un processo esterno avviato nell'applicazione.
    Mi spiego meglio
    nel mi codice avvio un programma esterno con il comando

    Runtime.getRuntime().exec("mioprogramma"+valore);

    Vorrei che quando chiudo il mio jFrame principale (cliccando sulla x) se "mioprogramma" è in esecuzione venga killato....

    Suggerimenti?

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

    Re: Chiudere processo esterno

    Originariamente inviato da Macgiglio
    vorrei saper un metodo per chiudere un processo esterno avviato nell'applicazione.

    Runtime.getRuntime().exec("mioprogramma"+valore);

    Vorrei che quando chiudo il mio jFrame principale (cliccando sulla x) se "mioprogramma" è in esecuzione venga killato....
    Se hai mai notato dalla documentazione, exec() restituisce un Process e questo ha il metodo destroy(). È una terminazione "brutale" .... potrebbe anche non andare bene in base a cosa fa il programma lanciato.
    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
    Sep 2007
    Messaggi
    137
    Si lo conoscevo gia il destroy ma non so come associarlo alla chiusura dell'applicazione.
    All'inizio pensavo che semplicemente chiudendo l'applicazione grazie al comando

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    chiudevo anche questi processi esterni avviati nel programma ma non è così....

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Macgiglio
    Si lo conoscevo gia il destroy ma non so come associarlo alla chiusura dell'applicazione.
    All'inizio pensavo che semplicemente chiudendo l'applicazione grazie al comando

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    chiudevo anche questi processi esterni avviati nel programma ma non è così....
    No infatti .... non potrebbe (e nemmeno dovrebbe!) saperlo!

    Semplicemente imposti DO_NOTHING_ON_CLOSE (non EXIT_ON_CLOSE) e registri un WindowListener sul JFrame per ricevere le notifiche e in windowClosing() fai quello che ti pare e poi fai un dispose(). Insomma ... devi gestire tu la chiusura.
    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
    Sep 2007
    Messaggi
    137
    ho scritto qualcosa del genere ma non va

    codice:
    ...
    ...
    {
    	this.addWindowListener(new WindowAdapter() {
    	public void windowClosing(WindowEvent e) {
    		try{
    		  Runtime.getRuntime().exec("taskkill.exe /programma1.exe");
    		  Runtime.getRuntime().exec("taskkill.exe /programma2exe");
    		  dispose ();
    		   } catch (Exception ioe)
    		{
    		  ioe.printStackTrace();
    			}		 
    			 }
    		});
    
    	}
    ...
    ...
    Ovviamente non funziona.....penso di non aver capito bene....mi posti un po' di codice?

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Macgiglio
    codice:
    		  Runtime.getRuntime().exec("taskkill.exe /programma1.exe");
    		  Runtime.getRuntime().exec("taskkill.exe /programma2exe");
    		  dispose ();
    Ovviamente non funziona.....penso di non aver capito bene....mi posti un po' di codice?
    Ma qui è già diverso da quanto hai detto prima.

    Se da Java vuoi prima lanciare un qualunque programma pincopalla.exe e poi terminarlo, sempre da Java, allora lo lanci con exec(), ti tieni da qualche parte il reference al Process e poi, quando successivamente vuoi terminarlo invochi destroy() su quel Process.

    Se invece vuoi lanciare un tool esterno es. taskkill.exe per terminare il programma, potrebbe anche funzionare ma: a) Il tool è dipendente dal S.O. e b) Devi conoscere bene gli eventuali parametri da passare al tool.

    Ora ... che cosa vuoi fare?? Cosa è che non ti è chiaro nel fatto di ottenere un Process dal exec()???
    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
    Sep 2007
    Messaggi
    137
    visto che il programma è lanciato in un'altra classe non riesco ad ottenere il reference. Avevo pensato quindi di verificare se iil programma era in esecuzione (guardando sul taskmanager di windows) e in caso positivo killarlo quando premo la X per chiudere la finestra.....

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Macgiglio
    visto che il programma è lanciato in un'altra classe non riesco ad ottenere il reference.
    E allora? Cosa vuol dire??? Guarda che è solo questione di "design" delle classi!!!

    Anzi ... vuoi una idea? Si potrebbe fare un design tale per cui non devi nemmeno far ritornare i Process. Fai una classe:

    codice:
    import java.util.*;
    
    public class Esecutore {
        private LinkedList<Process> listaProcessi;
    
        public Esecutore() {
            listaProcessi = new LinkedList<Process>();
        }
        
        public void esegui(String comando) throws IOException {
            Process p = Runtime.getRuntime().exec(comando);
            listaProcessi.add(p);
        }
        
        public void terminaTutti() {
            while (!listaProcessi.isEmpty())
                listaProcessi.remove(0).destroy();
            }
        }
    }
    Nella tua applicazione istanzierai solo 1 volta un Esecutore, quindi potrai invocare tutti gli esegui() che vuoi e quando vuoi terminare la applicazione invochi semplicemente terminaTutti() sulla istanza del tuo Esecutore.

    Lo vedi che la gestione dei Process è incapsulata in Esecutore?? Non devi restituire un ben niente!!

    Ripeto: è solo questione di "design"
    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
    Sep 2007
    Messaggi
    137
    Il tuo suggerimento mi è stato molto utile anche se in realtà non ho risolto quello che volevo....(non mi chiude un bel niente) .Mi aiutate a modificare la funzione windowClosing postata prima utilizzando la classe esecutore?

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Macgiglio
    Il tuo suggerimento mi è stato molto utile anche se in realtà non ho risolto quello che volevo....(non mi chiude un bel niente) .Mi aiutate a modificare la funzione windowClosing postata prima utilizzando la classe esecutore?
    Nel windowClosing() semplicemente invocherai es.:

    esec.terminaTutti();

    dove 'esec' chiaramente è il reference ad un Esecutore che ti devi tenere da qualche parte (variabile di istanza)
    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.