PDA

View Full Version : [Java]Errore a runtime che non capisco


Marco2000
06-04-2004, 09:06
Ho scritto questo pezzo di codice che mi richiama un EXE che si trova nella stessa cartella del sorgente:

public class Miomidchord
{

public static void main(String[]args)
{
String comando="midchord -half -fmt prova.mid prova2.mid";
runShell(comando);
System.out.println("sono tornato dal metodo");
}

public static boolean runShell ( String exe )
{
try
{
System.out.println("sono entrato nel metodo");
Runtime rt = Runtime.getRuntime();
System.out.println(exe);
Runtime.getRuntime().exec("midchord -half -fmt prova.mid prova2.mid" );
System.out.println("eseguito exec");

System.out.println("Finito " + exe);
}
catch(Exception e)
{
e.printStackTrace();
return false;
}
return true;
}
}

Il compilatore non da errori ma quando lo eseguo mi da l'errore che allego, intanto il programma termina "correttamente" (non esegue però l'EXE di cui prima).

Mi potete aiutare?

cn73
06-04-2004, 09:29
ntvdm.exe è la Windows 16-bit Virtual Machine...quel programma è un vecchio programma DOS? Potrebbe semplicemente non essere compatibile con Windows...

Marco2000
06-04-2004, 12:44
Si, è un porgramma per DOS ma se lo faccio partire da START->ESEGUI funziona correttamente....

Forse ho sbagliato qualcosa ne l codice ?

kingv
06-04-2004, 12:49
prova:


Runtime.getRuntime().exec("cmd /c start midchord -half -fmt prova.mid prova2.mid" );

Marco2000
06-04-2004, 12:52
GRAZIE!!

a cosa server /c ???

Ora devo solo trovare il sistema di scandire il contenuto di una directory per memorizzare in una stringa i nomi dei files midi.

Marco2000
06-04-2004, 13:17
Dunque, ho visto che quello che mi nteressa si trova su java.io.* solo che trovo riferimento per linux e non per windows....

mi sapete dire come potrei realizzare qualcosa del tipo:

String nomefile;
while(nella cartella c'è un file .mid)
{
nomefile=il nome del file;
}

kingv
06-04-2004, 13:26
Originariamente inviato da Marco2000
GRAZIE!!

a cosa server /c ???

Ora devo solo trovare il sistema di scandire il contenuto di una directory per memorizzare in una stringa i nomi dei files midi.


a chiudere il prompt di msdos quando finisce il prgramma che lanci :O

kingv
06-04-2004, 13:30
Originariamente inviato da Marco2000
Dunque, ho visto che quello che mi nteressa si trova su java.io.* solo che trovo riferimento per linux e non per windows....

mi sapete dire come potrei realizzare qualcosa del tipo:




File dir = new File("tua directory");

String[] lista = dir.list();

if (lista != null)
for (int i=0; i<lista.length; i++)
{
String nomefile = lista[i];
}



occhio che cosi' pero' visualizza anche le sottodirectory, se vuoi solo i file occorre complicare un attimo le cose...

Marco2000
06-04-2004, 13:36
Grazie, fin qui c'ero arrivato anche io solo che in listai] c'è il percorso assoluto mentre io vorrei solo il nome del file con l'estenzione ma senza il path.

Marco2000
06-04-2004, 14:14
Ho risolto con substring() però ho un altro problema e questo non so se sarà possibile risolverlo....

il programma DOS che richiamo carica senza problema qualsiasi file con nome più lungo anche di 8 caratteri ma non me lo risalva.
Se invece gli dico di salvare con un nome breve ce la fa....

Questo è risolvibile?

kingv
06-04-2004, 14:39
Originariamente inviato da Marco2000
Grazie, fin qui c'ero arrivato anche io solo che in listai] c'è il percorso assoluto mentre io vorrei solo il nome del file con l'estenzione ma senza il path.




File[] files = dir.listFiles();

for(ecc.ecc)
String file = files[i].getName();

kingv
06-04-2004, 14:40
Originariamente inviato da Marco2000
Ho risolto con substring() però ho un altro problema e questo non so se sarà possibile risolverlo....

il programma DOS che richiamo carica senza problema qualsiasi file con nome più lungo anche di 8 caratteri ma non me lo risalva.
Se invece gli dico di salvare con un nome breve ce la fa....

Questo è risolvibile?

se non e' in grado lui di risalvare non ci puoi fare nulla, penso ;)

Marco2000
06-04-2004, 14:43
Grazie mille!!!

Altro problema: se faccio partire molte istanze(ne ho provate 250) di cmd mi intasa il pc, il problema sicuramente è qui:

public static boolean runShell ( String exe )
{
try
{
Runtime rt = Runtime.getRuntime();
Runtime.getRuntime().exec(exe);
}
catch(Exception e)
{
e.printStackTrace();
return false;
}
return true;
}

C'è un comando, da mettere dopo la exec(exe), che aspetti l'esecuzione della cmd prima di passare alla successiva ???

kingv
06-04-2004, 14:49
public static boolean runShell ( String exe )
{
try
{
Runtime rt = Runtime.getRuntime(); //togli questa riga che non ti serve
Process p = Runtime.getRuntime().exec(exe);
p.waitFor();

}
catch(Exception e)
{
e.printStackTrace();
return false;
}
return true;
}

Marco2000
06-04-2004, 14:50
Grazie mille, l'avevo trovato ora ora su un sito ma mi dice anche di fare questo:

p.getInputStream().close();
p.getOutputStream().close();
p.getErrorStream().close();


serve ?

cn73
06-04-2004, 14:50
[EDIT

Marco2000
06-04-2004, 14:51
Originariamente inviato da cn73
Ti conviene dare un'occhiata ai Thread...

C'HO FURIA !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

cn73
06-04-2004, 14:53
Originariamente inviato da kingv

public static boolean runShell ( String exe )
{
try
{
Runtime rt = Runtime.getRuntime(); //togli questa riga che non ti serve
Process p = Runtime.getRuntime().exec(exe);
p.waitFor();

}
catch(Exception e)
{
e.printStackTrace();
return false;
}
return true;
}


Questo è un argomento che mi interessa... Ma si possono effettuare chiamate tipo wait e fork di Unix?

kingv
06-04-2004, 14:53
Originariamente inviato da Marco2000
Grazie mille, l'avevo trovato ora ora su un sito ma mi dice anche di fare questo:

p.getInputStream().close();
p.getOutputStream().close();
p.getErrorStream().close();


serve ?


penso di no, lo dovrebbe fare in automatico

Marco2000
06-04-2004, 14:57
Si, funziona!!

Il mio problema è che siamo su windows, se ero su linux facevo un programmino in C con sleep,waitpid e cose varie ma qui non sapevo come muovermi !!!!!

Grazie ancora

kingv
06-04-2004, 14:58
Originariamente inviato da cn73
Questo è un argomento che mi interessa... Ma si possono effettuare chiamate tipo wait e fork di Unix?


ehm... no non son proprio la stessa cosa.
e poi in java un approccio del genere sarebbe pesantissimo

Fuzzo
07-04-2004, 10:51
Se ti guardi i thread dovresti trovare questi metodi di tuo gradimento:
wait()
notify()
notifyAll()
yeld()
sleep()
...