Visualizzazione dei risultati da 1 a 3 su 3

Discussione: java, thread e gui

  1. #1

    java, thread e gui

    Salve a tutti. Ho un problema

    Sto sviluppando un'applet che si collega ad un database (dove son memorizzati dei path). L'applicazione, prende il path dal database, scannerizza un file, e copia questo dentro un server nel path corrispondende memorizzato nel database tramite spc. Il programma spc viene invocato tramite l'oggetto Runtime.getRuntime(),exec().
    Ora, premesso che, tutto il meccanismo di copia e scannerizzazione funziona, il mio problema è il seguente:

    ho un'imamgine gif di una barra che si muove e una jlabel con il titolo "attendere fine caricamento". L'immagine dovrebbe scomparire quando il caricamento è effettuato, cioè quando l'oggetto RUntime termina la sua esecuzione.

    Il thread viene avviato alla pressione di un tasto però, con mia meraviglia, il tasto si blocca, il frame dell'applet non si aggiorna, e si sblicca solo quando l'oggetto Runtime termina.

    La porzione di codice che uso è la seguente


    public void actionPerformed(ActionEvent arg0) {

    if(arg0.getSource() == finishScanButton)
    {
    scanButton.setEnabled(false);
    finishScanButton.setEnabled(false);
    label.setVisible(false);
    scannerChooser.setVisible(false);
    add(waitingLabelText);
    add(waitingLabelImage)
    ThreadProcess tp = new ThreadProcess(getApplet(), idd, serverAdrs);
    tp.run();
    }
    }

    Naturamlemte, se commento ThreadProces tp e tp.run(), la barra viene visualizzata mentre, se faccio eseguire il thread, mi si blocca il pulsante e l'applet stessa fino alla fine dell'esecuzione del thread.

    Come faccio a gestire cio? cioè a far prima caricare l'immagine e poi far eseguire la porzione di codice del thread. (ps, avevo provato anche senza thread, mettendo una funzione finishScan all'interno della classe, contenente le stesse istruzioni contenute nella funzione run() del thread, ma ho lo stesso problema: mi si blocca il tasto)

    si accettano soluzioni anche senza l'ausiluio del thread.
    Grazie

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

    Re: java, thread e gui

    Originariamente inviato da ulisseodisseo
    ThreadProcess tp = new ThreadProcess(getApplet(), idd, serverAdrs);
    tp.run();
    ThreadProcess ovviamente non so cosa sia di preciso (non l'hai detto) ma potrei supporre che sia una estensione di java.lang.Thread.

    Bene (anzi male). In ogni caso non devi invocare tu il run() del Thread (o Runnable che sia). Perché se lo invochi tu esplicitamente, lo fai in modo "sincrono" nel thread corrente .... esattamente come se invocassi un qualunque altro metodo che "fa qualcosa". Non avresti cioè un nuovo "flusso di esecuzione".

    I thread si avviano solo con il start() invocato su un oggetto java.lang.Thread. Perché è la JVM, con l'eventuale (e anzi tipico) ausilio del S.O., che rende possibile la creazione di un nuovo "flusso" di esecuzione separato da quello corrente.

    Originariamente inviato da ulisseodisseo
    Naturamlemte, se commento ThreadProces tp e tp.run(), la barra viene visualizzata mentre, se faccio eseguire il thread, mi si blocca il pulsante e l'applet stessa fino alla fine dell'esecuzione del thread.

    Come faccio a gestire cio?
    Usando meglio i thread, come detto sopra.

    E innanzitutto hai chiare le questioni sul threading in Swing? Perché queste cose devono essere molto ben chiare:

    - Concurrency in Swing
    - Threads and Swing

    Originariamente inviato da ulisseodisseo
    si accettano soluzioni anche senza l'ausiluio del thread.
    No, un thread devi comunque usarlo se devi eseguire un lavoro "lungo", altrimenti se lo facessi nel contesto del EDT "congelerebbe" tutta la interfaccia utente.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3

    [SOLVED]

    Risolto... grazie mille per la dritta.

    In effetti, avevo già provato i metodi Invokelater per le swing, solo che mi si bloccava ugualmente.

    Ho risolto creando il Tread dentro ThreadProcess (che impolementa RUnnable.. scusa per la svista) e lanciando il metodo start.

    Errore da dilettante.... ooooops :-P

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.