Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2004
    Messaggi
    111

    [Sconcertante] ORDINE di esecuzione istruzioni

    Guardate queste poche e banali righe, alla pressione di un JButtonf fa questo:

    codice:
    public void actionPerformed(ActionEvent e) {
    	txtLog.setText("pippo");
    	for (int i=0; i<10000; i++) {
    		System.out.println(i);	
    	}
    }
    Viene PRIMA eseguito tutto il ciclo e POI viene scritto "pippo" sulla JTextArea, in pratica:

    codice:
    1
    2
    3
    4
    5
    6
    ...
    visualizza "pippo" su JTextArea
    Perche???
    Come faccio ad eseguire le istruzioni nell'ordine giusto?
    E' un problema di ridisegno del componente credo perché sostituendo:

    codice:
    txtLog.setText("pippo");
    con

    codice:
    System.out.println("pippo");
    l'ordine è corretto.
    Ho già provato ad invocare subito repaint() ma tutto inutile...

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    È molto semplice (e non devi stupirti/sconvolgerti per questo!): i sistemi AWT/Swing usano quello che viene chiamato "event dispatch thread", cioè un thread che si occupa di gestire/aggiornare l'interfaccia utente e dispacciare gli eventi.

    Il metodo actionPerformed() così come gli altri metodi legati ad altri eventi, viene chiamato nel contesto di questo event dispatch thread. Qualunque modifica tu faccia alla interfaccia utente da dentro questo metodo, verrà realizzata effettivamente solo quando l'esecuzione ritorna all'interno del framework AWT o Swing.

    Quello che devi sapere, in pratica, è che non devi bloccare per troppo tempo (con tante println come hai fatto) questo thread particolare, altrimenti "congeli" l'interfaccia utente.
    Dovresti creare un nuovo thread per fare operazioni lunghe.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320

    Moderazione

    Sebbene la cosa possa sembrare sconcertante, il linguaggio usato è "Java" e non "Sconcertante"...

    Fra le parentesi quadre del titolo, infatti, va specificato il linguaggio.

    Lo modifico io.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2004
    Messaggi
    111
    Questo vale solo per controlli Swing?
    Se prima del ciclo mettessi del codice per scrivere su un file si verificherebbe lo stesso problema?
    Prima esegue il ciclo e poi scrive su file?

    Un semplice thread che mi faccia poter eseguire contemporaneamente queste due fasi (aggiornamento textarea o scrittura file + ciclo) come potrebbe essere?

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da replika82
    Questo vale solo per controlli Swing?
    Se prima del ciclo mettessi del codice per scrivere su un file si verificherebbe lo stesso problema?
    Prima esegue il ciclo e poi scrive su file?

    Un semplice thread che mi faccia poter eseguire contemporaneamente queste due fasi (aggiornamento textarea o scrittura file + ciclo) come potrebbe essere?
    La questione riguarda la gestione dell'interfaccia grafica AWT / Swing.

    Qualunque altra cosa che tu voglia fare, usare System.out.println, scrivere su un file, fare calcoli, ecc... viene fatta ovviamente e senza alcun dubbio nell'ordine in cui le hai scritte.

    Il fatto è che l'interfaccia utente viene gestita e aggiornata nel "event dispatch thread" ma se tu ci sei dentro a questo thread e fai qualunque altra operazione lunga, l'aggiornamento avverrà solo quando il controllo ritorna al framework e cioè a quello che l'event dispatch thread stava facendo prima di "dispacciare" l'evento.
    Tutto qui.

    Se devi fare operazioni lunghe, scrivere su file, fare calcoli complessi, ecc.... è consigliabile creare un nuovo thread.
    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.