Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di morphy79
    Registrato dal
    Jun 2004
    Messaggi
    1,568

    alternativa a Runtime.getRuntime

    esiste una alternativa a questo comando ?
    ho un problema strano.. ho un'applet che lancia un thread separato che richima un exe, attendendo sua risposta...
    l'exe ad un certo punto del suo processo, in un jar che non so cosa fa, si blocca..
    rimane tutto bloccato..
    quando chiudo l'applet a mano, l'exe richiamato si sblocca e fa tutto quello che deve fare..
    non capisco dove sbaglio...

    ricordo però che qualcuno aveva parlato di un'alternativa a Runtime.getRuntime.. ma non trovo il thread..
    odio chi parla di politica..
    anzi vorrei fondare un partito contro tutto ciò

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

    Re: alternativa a Runtime.getRuntime

    Originariamente inviato da morphy79
    esiste una alternativa a questo comando ?
    Parli di exec() di Runtime, chiaramente. L'unica alternativa, solo da Java 5, è la classe ProcessBuilder.

    Originariamente inviato da morphy79
    ho un problema strano.. ho un'applet che lancia un thread separato che richima un exe, attendendo sua risposta...
    l'exe ad un certo punto del suo processo, in un jar che non so cosa fa, si blocca..
    rimane tutto bloccato..
    quando chiudo l'applet a mano, l'exe richiamato si sblocca e fa tutto quello che deve fare..
    non capisco dove sbaglio...
    L'eseguibile che lanci fa dell'output su standard-output/error? E tu lo leggi?
    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 L'avatar di morphy79
    Registrato dal
    Jun 2004
    Messaggi
    1,568
    si ecco il codice di quello che fa..
    perchè sbaglio a leggere ? cioè, non devo leggere ?

    codice:
    	// FUNZIONE PER ESEGUIRE UN FILE .EXE O .BAT
    	public int runFile(String pathfile){
    		int exitVal = 0;
    		String errors = "";
    		try {
    
    			Runtime rt = Runtime.getRuntime();
    	           String osName = System.getProperty("os.name" );
    	            String command = "";
    	            if( osName.equals( "Windows NT" ) )
    	            {
    	                command = "cmd.exe /C" ;
    	            }
    	            else if( osName.equals( "Windows 95" ) )
    	            {
    	            	command = "command.com /C" ;
    	            }
    			Process proc = rt.exec(command + pathfile);
    			
    			
    			//Process proc = new ProcessBuilder(command + pathfile).start();
    
    			InputStream stderr = proc.getErrorStream();
    			InputStreamReader isr = new InputStreamReader(stderr);
    			BufferedReader br = new BufferedReader(isr);
    			String line = null;
    			errors = errors + "Process exeFileName: " + pathfile + "\r\n";
    			while ( (line = br.readLine()) != null){
    				errors = errors + line + "\r\n";
    			}
    			exitVal = proc.waitFor();
    			errors = errors + "Process exitValue: " + exitVal;
    		} catch (Throwable t){
    			// SCRITTURA LOG
    			System.out.println("JAVA ERROR " + t.getMessage());
    			
    			JOptionPane.showMessageDialog(null, t.getMessage());
    			exitVal = -1;
    		}
    		return exitVal;
    
    	}
    odio chi parla di politica..
    anzi vorrei fondare un partito contro tutto ciò

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da morphy79
    si ecco il codice di quello che fa..
    perchè sbaglio a leggere ? cioè, non devo leggere ?
    No devi leggere l'output del programma ... se ne fa. Vedo che leggi lo std-err. Ok ma fa output anche sullo std-out?? Se sì, devi leggere anche quello.

    P.S. Se devi avviare file eseguibili (.exe, .com, .bat) non ci sarebbe alcun bisogno di invocare espressamente l'interprete dei comandi cmd/command a seconda del S.O.!!
    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 L'avatar di morphy79
    Registrato dal
    Jun 2004
    Messaggi
    1,568
    scusa non ho capito bene..
    il mio programma exe scrive una marea di output (se lo eseguo da eclipse vedo tutto quello che viene scritto System.out)
    tutto quanto viene scritto dalla libreria della firma digitale (di cui non ho sorgenti ma solo il jar)
    quello che tu mi dici è di leggere anche questo ?
    quindi così (non va ancora ) ?

    codice:
    	// FUNZIONE PER ESEGUIRE UN FILE .EXE O .BAT
    	public int runFile(String pathfile){
    		int exitVal = 0;
    		String errors = "";
    		String messages = "";
    		
    		try {
    
    			Runtime rt = Runtime.getRuntime();
    			Process proc = rt.exec(pathfile);
    
    			//Process proc = new ProcessBuilder(command + pathfile).start();
    
    			InputStream stderr = proc.getErrorStream();
    			InputStreamReader isr = new InputStreamReader(stderr);
    			BufferedReader br = new BufferedReader(isr);
    			String line = null;
    			errors = errors + "Process exeFileName: " + pathfile + "\r\n";
    			while ( (line = br.readLine()) != null){
    				errors = errors + line + "\r\n";
    			}
    			
    			InputStream stdout = proc.getInputStream();
    			InputStreamReader isrout = new InputStreamReader(stdout);
    			BufferedReader brout = new BufferedReader(isrout);
    			messages = messages + "Process exeFileName: " + pathfile + "\r\n";
    			while ( (line = brout.readLine()) != null){
    				messages = messages + line + "\r\n";
    			}
    			
    			exitVal = proc.waitFor();
    			errors = errors + "Process exitValue: " + exitVal;
    		} catch (Throwable t){
    			// SCRITTURA LOG
    			System.out.println("JAVA ERROR " + t.getMessage());
    			
    			JOptionPane.showMessageDialog(null, t.getMessage());
    			exitVal = -1;
    		}
    		return exitVal;
    
    	}
    odio chi parla di politica..
    anzi vorrei fondare un partito contro tutto ciò

  6. #6
    Utente di HTML.it L'avatar di morphy79
    Registrato dal
    Jun 2004
    Messaggi
    1,568
    ho risolto leggendo diversamente gli stream..

    codice:
                StreamGobbler errorGobbler = new StreamGobbler(proc.getErrorStream(), "ERROR");            
                StreamGobbler outputGobbler = new StreamGobbler(proc.getInputStream(), "OUTPUT");
    
                errorGobbler.start();
                outputGobbler.start();
    ma come mai ? qualcuno mi sa dire cosa cambia ?
    odio chi parla di politica..
    anzi vorrei fondare un partito contro tutto ciò

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da morphy79
    ma come mai ? qualcuno mi sa dire cosa cambia ?
    Così come hai appena fatto, fai la lettura di entrambi gli stream in modo concorrente. Cioè ognuno va avanti nella lettura per conto suo.

    Prima invece l'avevi fatto sequenziale, prima tutto lo std-err, poi tutto lo std-out. Se il processo che avvii non fa output su std-err, tu stai lì in ciclo ad aspettare. Ma intanto il processo magari si mette a fare molto output sullo std-out. Per questioni di buffering (ed è per questo che devi leggere l'output!) ad un certo punto il processo si blocca proprio perché non stai leggendo il suo std-out.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it L'avatar di morphy79
    Registrato dal
    Jun 2004
    Messaggi
    1,568
    ah capito perfetto grazie !!!!
    non sai che problema enorme che mi hai risolto !!!
    ora posso andare avanti, grazie
    odio chi parla di politica..
    anzi vorrei fondare un partito contro tutto ciò

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.