Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    160

    [JAVA] Lanciare programma esterno

    Ciao a tutti!

    Ho creato una classe per lanciare un eseguibile esterno. La classe è la seguente:

    codice:
    public class ExternalProgram extends Thread{
    	private String[] command = {"cmd","/C","start", null}; 
    	
    	ExternalProgram(String s){
    		command[3] = s;
    	}
    	
    	public void run(){
            String line = null;
    		try{
    			Process pr = Runtime.getRuntime().exec(command,null, new File(System.getProperty("user.home") + "\\workspace\\SocialNetworkInterface\\crawler")); 
                InputStream is = pr.getInputStream();
    	    InputStreamReader isr = new InputStreamReader(is);
                BufferedReader br = new BufferedReader(isr);
                pr.waitFor();
                System.out.println(" returned " + pr.exitValue());
                while ((line = br.readLine()) != null)
                    System.out.println(line);
            }catch(InterruptedException e){
                System.out.println("Processo interrotto");
            } catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    	
    }
    Per lanciare l'eseguibile creo un oggetto di tipo ExternalProgram (da un'altra classe) con il nome dell'eseguibile e poi lancio ep.start(). All'avvio si apre una finestrella DOS e il programma inizia a girare. Visto che questo programma stampa a schermo alcune cose, a me servirebbe catturarle per poi poterle mettere in una JTextArea. Ora per provare le sto stampando su System.out, però facendo così non stampa niente. Dov'è che sbaglio?

    Infine, altro problema, quando lancio interrupt() il programma non si ferma. Come mai?

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

    Re: [JAVA] Lanciare programma esterno

    Originariamente inviato da Manugal
    Ora per provare le sto stampando su System.out, però facendo così non stampa niente. Dov'è che sbaglio?
    Se il processo lanciato fa dell'output su standard-output, allora lo devi leggere!! Se non lo leggi, per questioni di buffering, è possibile che il processo lanciato addirittura si blocchi, in attesa che venga letto il suo output.
    Quindi non fare prima un waitFor .... prima leggi, poi se vuoi aspettare la completa terminazione allora usi waitFor.
    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
    Mar 2006
    Messaggi
    160
    Quindi mi stai dicendo che devo mettere waitFor() alla fine? Già provato non legge niente comunque. Ti posto uno screenshot così si vede meglio il comportamento (spero si riesca a vedere).
    Immagini allegate Immagini allegate

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Alt ... attenzione a una cosa: se usi il comando 'start' di cmd, il processo viene lanciato in modo asincrono, ovvero cmd.exe lo avvia ma NON attende la sua terminazione (cmd termina quasi subito). Quindi è chiaro che non puoi leggere l'output di quel processo.
    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
    Mar 2006
    Messaggi
    160
    Ho provato a lanciare solo cmd /C crawler.exe e siccome il programma lanciato mi è ritornato subito (a causa di un errore su un file che dovrebbe aprire) mi ha stampato effettivamente quello che ha fatto. Risolto questo errore (cioè nella situazione normale in cui dovrebbe partire), il programma quando parte non ritorna subito; quindi in questo caso non mi stampa niente. Come mai? Cioè è come se dovessi aspettare che finisca il suo lavoro per vedere stampato a schermo i risultati. Invece vorrei che mi stampasse riga per riga quello che fa.

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Manugal
    Cioè è come se dovessi aspettare che finisca il suo lavoro per vedere stampato a schermo i risultati. Invece vorrei che mi stampasse riga per riga quello che fa.
    Quell'eseguibile crawler.exe l'hai sviluppato tu?? Comunque la situazione che descrivi è dovuta non a Java ma a come il programma lanciato invia l'output (ci sono questioni di buffering).
    Leggi questa discussione in cui spiegavo questa cosa.
    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
    Mar 2006
    Messaggi
    160
    Ho capito. Il programma si l'ho sviluppato io, è in Python. Quindi che cosa dovrei modificare in quel programma? Dovrei fare un flush di ogni print che fa?

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    160
    Problema risolto!!!!

    Ho aggiunto dopo ogni print nel programma Python una sys.stdout.flush() ed ora stampa effettivamente riga per riga. Ora l'ultimo problema è che quando lancio interrupt(), il processo non si ferma. Ma devo aspettare per forza che finisca lui? Io vorrei che quando premo il pulsante Stop il processo si fermi immediatamente. Come posso fare?

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Manugal
    Ora l'ultimo problema è che quando lancio interrupt(), il processo non si ferma. Ma devo aspettare per forza che finisca lui? Io vorrei che quando premo il pulsante Stop il processo si fermi immediatamente. Come posso fare?
    Tu hai avviato un nuovo thread e il interrupt() lo invochi chiaramente (immagino ma è sicuramente così) sul Thread. interrupt() però di per sé non interrompe un bel niente. La terminazione/sospensione di un thread è una cosa che va fatta in modo "cooperativo", ovvero è il codice del thread che deve essere scritto in modo da essere "cooperativo" per poter agire in un certo modo quando un altro thread ne chiede la terminazione.

    Ti suggerisco di leggere:
    http://java.sun.com/javase/6/docs/te...precation.html
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    160
    Ho letto quell'articolo.

    Il problema nel mio caso è un po' più complesso, perché all'interno di questo thread lancio un processo. Quindi se nel metodo run() metto un while su una variabile Thread volatile, quello mi aprirà comunque processi all'infinito per come è strutturato. Non saprei come gestire questa cosa.

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.