Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    Richiamare command line da java

    Salve a tutti,
    vorrei far funzionare meglio il mio programmino java. Qualcuno può aiutarmi?
    Vi spiego meglio! Riporto brevemente, dapprima una breve descrizione testuale del sorgente, seguita dal problema e dal codice sorgente.

    Descrizione: Il codice richiama un programma da command line, il cui compito è quello di effettuare il calcolo di un equilibrio di nash in mixed strategy. Per fare questo calcolo, viene prima creato un file sul filesystem di nome gameRef.nfg, il quale poi viene elaborato tramite il metodo execute, che restituisce l'insieme delle probabilità sotto forma di vettore di double.

    Problema: la scrittura del file nrg (generato ad ogni iterazione) è ritardata dal programma che precedentemente l'ha usato. Per evitare che il programma si arresti al verificarsi dell'eccezione, ho dovuto inserire il codice in un while che tenta finché non si verifica il rilascio. È possibile evitare questa attesa? ci sono altre soluzioni? consigli?

    Vi ringrazio per l'aiuto.

    Codice:

    Nel metodo main() il codice d'interesse è il seguente:

    main(){

    while(...){
    ...
    String command = "cmd /c gambit-simpdiv < ";
    String pathFile = "C:\\Programmi\\Gambit\\games\\gameRef.nfg";
    printGameNfg(pathFile, ps);
    ExternalCommand cmd = new ExternalCommand(command, pathFile);
    double[] ne = cmd.execute();
    m.computeNashPayOff(ne);
    ...
    }
    }

    Il codice del metodo printGameNfg(...):
    private static void printGameNfg(String pathFile, String ps) {
    int i = 100;
    while(i<1000){
    try{
    System.out.println("Durante la creazione di "+pathFile+" si sono verificati
    dei problemi");
    System.out.println("Ritento!");
    PrintStream out = new PrintStream(new FileOutputStream(pathFile));
    out.print(ps);
    out.flush();
    out.close();
    break;
    }
    catch(FileNotFoundException ex){
    ex.printStackTrace();
    i++;
    }
    }//end while
    }//end method

    Mentre il codice per il metodo execute() della classe ExternalCommand è il seguente:
    public double[] execute() {
    File fpath;
    try {
    Runtime run= Runtime.getRuntime();
    fpath = new File( "C:\\Programmi\\Gambit\\");
    Process processo = run.exec(totalCommand , null, fpath);
    String line = "";

    BufferedReader input = new BufferedReader(
    new InputStreamReader(processo.getInputStream())
    );

    if ((line = input.readLine()) != null) {
    ExtractMixedStrategyNE e = new ExtractMixedStrategyNE(line);
    return e.extract();
    }


    } catch (IOException e1) {
    e1.printStackTrace();
    }
    return null;
    }
    Raffaele

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

    Re: Richiamare command line da java

    Originariamente inviato da morrison123
    Problema: la scrittura del file nrg (generato ad ogni iterazione) è ritardata dal programma che precedentemente l'ha usato. Per evitare che il programma si arresti al verificarsi dell'eccezione, ho dovuto inserire il codice in un while che tenta finché non si verifica il rilascio. È possibile evitare questa attesa?
    Se non devi fare altro in modo "speculativo" mentre il processo lanciato è ancora in esecuzione, allora dopo che hai gestito i suoi standard output e/o input, attendi che il processo abbia davvero terminato usando waitFor() di Process.

    P.S. Se gambit-simpdiv è un eseguibile (nel senso di quello che il sistema ritiene "eseguibile", es. su Windows i .exe), allora sappi che non c'è bisogno obbligatoriamente del cmd /c.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Grazie per la tempestiva risposta Andrea!
    Il file che richiamo da command line è un eseguibile. Vorrei che non appena abbia finito di processare il file, lo rilasci immediatamente. Ho notato che il tempo che trascorre nell'attesa del rilascio è costante, molto probabilmente è killato dopo un certo timeout dal sistema operativo.
    Raffaele

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 © 2026 vBulletin Solutions, Inc. All rights reserved.