Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2013
    Messaggi
    14

    Problema runtime.exec()

    Salve a tutti, vi spiego subito cosa fa il mio programma, il main richiama questo metodo in un ciclo for in modo da far eseguire il comando programma.exe che, dato un file di input, genera un file txt. Il ciclo for permette di eseguire programma.exe su più file che vengono dati in input, ora il problema è che se seleziono molti file da far elaborare il programma rimane apparentemente bloccato finchè non gli esegue tutti, quindi avevo deciso di inserire in una textarea una frase tipo: "file 3 di 100 in elaborazione" dove il 3 era l'indice del ciclo for, ma questo non accade, solo quando finisce di elaborare tutti i file mi appare la scritta: "file 100 di 100 in elaborazione". Cosa posso fare per aggiornare la textarea ogni volta che viene terminato un "giro"del ciclo for? Spero di essere stato chiaro :P
    Questo è il codice dell'esecuzione del programma:
    codice:
    public static File runExe(String dir) throws InterruptedException {
         
        try{
            Runtime rt=Runtime.getRuntime();               
            Process proc=rt.exec("programma.exe " + dir + " file.txt");
            proc.waitFor();               
        }
        catch (IOException e) {
            System.out.println("Errore: " + e);
            System.exit(1);
        }
        File file = new File("file.txt");
        return file;
    }
    Ultima modifica di pocce90; 19-11-2013 a 20:07

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da pocce90 Visualizza il messaggio
    il problema è che se seleziono molti file da far elaborare il programma rimane apparentemente bloccato
    Presumo che quel runExe, che è "bloccante" per via del waitFor, lo esegui nel contesto del EDT, Event Dispatch Thread, a seguito di un evento di un componente.
    Questione già discussa decine di volte sul forum: il EDT non va mai tenuto "impegnato" per troppo tempo, pena il "congelamento" della interfaccia grafica. In questo caso dovresti usare un thread a parte.
    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
    Nov 2013
    Messaggi
    14
    Il programma è praticamente terminato devo solo inserire una progress bar, l'unica soluzione è quella di far eseguire il programma in multithread? Non c'è una soluzione più semplice?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da pocce90 Visualizza il messaggio
    l'unica soluzione è quella di far eseguire il programma in multithread?
    Nel caso di operazioni "lunghe", sì generalmente "la soluzione" è il multi-threading. Poi tecnicamente ci sono diverse possibilità: uso diretto di Runnable/Thread, uso di SwingWorker (di serie da Java 6; specialmente se il "lavoro" deve aggiornare di tanto in tanto la interfaccia utente) oppure negli scenari più sofisticati i "thread pool" (di serie da Java 5).

    Quote Originariamente inviata da pocce90 Visualizza il messaggio
    Non c'è una soluzione più semplice?
    Senza vedere il tuo codice comunque non posso dire più di tanto ma se ho intuito/interpretato bene il tuo scenario ... ripeto che la soluzione è l'uso dei thread.
    Anzi ... la soluzione sarebbe che tu avessi (avuto) ben chiaro questi aspetti del threading in Swing, che sono fondamentali. Noto spesso invece che queste cose sono abbastanza ignorate/sottovalutate.
    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
    Nov 2013
    Messaggi
    14
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Noto spesso invece che queste cose sono abbastanza ignorate/sottovalutate.
    Infatti questa è la mia prima esperienza in java con interfaccia grafica ...vabè..mi interessa lo swingWorker, adesso me lo studio e vedo cosa viene fuori...grazie comunque sono sicuro che ci torneremo presto

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2013
    Messaggi
    14
    Ok ho risolto questo problema tramite i thread, grazie mille, non riesco a capire come possa mettere risolto nel titolo della discussione...

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da pocce90 Visualizza il messaggio
    Ok ho risolto questo problema tramite i thread
    Giusto per sapere: hai usato direttamente Runnable/Thread o SwingWorker? Nel primo caso, se nel contesto del tuo thread volevi aggiornare la interfaccia utente, hai prestato attenzione a far eseguire l'accesso ai vari componenti grafici dal EDT (e non dal tuo thread)?
    Nel secondo caso, SwingWorker aiuta un (bel) po' in tal senso, anche se va capito il modo di lavorare di SwingWorker.
    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.