Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    883

    (java) Thread client - server

    Ho il seguente problema
    Ho un programma MyProgram composto da JTextPane su cui visualizzo del smeplice testo
    Questo programma è implementato come un Thread che sta in ascolto su una porta
    Quando l'utente decide di aprire un file di testo con il programma MyProgram, il testo viene spedito al ThreadServer.
    Fino a qui tutto funziona, il testo viene spedito correttamente sul socket, e il ThreadServer lo riceve, infatti se faccio un
    System.out.println(testo);
    Sulla console posso leggere il testo contenuto nel file
    A questo punto devo visualizzare questo testo sul mio componente swing JTextPane e lo faccio con l'istruzione

    JTextPane editor = new JTextPane();

    ************************

    if (editor != null)
    editor.setText(testo);

    Il porgramma si blocca a questa riga e non riesco a capire come mai. Se debuggo (uso eclipse) mi dice
    Thread not suspended stack frame unavailable

    Il thread server è implementato così:

    codice:
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.Socket;
    
    import javax.swing.JFrame;
    
    public class MyServerThread extends Thread {
    	private Socket socket = null;
    
    	public MyServerThread(Socket socket) {
    		super("MyServerThread");
    		this.socket = socket;
    	}
    
    	public void run() {		
    		try {
    			BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    			
    			String inputLine = null;
    			String fileAbsPath = null;
    			while ((inputLine = in.readLine()) != null) {				
    				fileAbsPath = inputLine;
    					
    			}			
    			in.close();
    
    			BuildEditor frame = BuildEditor.frame;
    			if (fileAbsPath != null && !fileAbsPath.equals("null")) {				
    				OpenFile.openFile(fileAbsPath);
    			}
    			
    			TextEditor editor = frame.editor;
    			if (editor != null) 							String text = OpenFile.getTextFile();
    				System.out.println("testooo: "+text);//arrivo fino a questa riga
    				editor.setText(text);//qui si blocca
    				System.out.println("FINE");//qui non si arriva mai
    
    			}
    			
    		} catch (IOException e1) {
    			e1.printStackTrace();
    		}		
    	}
    }
    Se commento la riga
    editor.setText(text);
    Il programma non si blocca. Il programma si blocca anche se al posto della sopracitata riga metto
    editor.setText("prova");

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    883
    è ben accetto qualsiasi suggerimento
    non so che pesci prendere

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,305
    Ho usato anch'io il JTextPane... però per aggiungere il testo non ho usato direttamente il metodo setText(), ma ho usato questo:
    codice:
    StyledDocument doc = editor.getStyledDocument();
    doc.insertString();
    doc.insertString(doc.getLength(), testo, doc.getStyle(stile);
    dove stile l'ho definito io, utilizzando StyleConstants e StyleContext (se vuoi darci un'occhiata è qualcosa di carino per lo stile di formattazione del testo).

    In alternativa, credo che tu possa fare qualcosa del genere:
    codice:
    Document doc = editor.getDocument();
    doc.insertString(doc.getLength(), testo, StyleContext.getDefaultStyleContext().getEmptySet());
    Non ti garantisco che la cosa funzioni, però tentar non nuoce.


    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
    Oct 2002
    Messaggi
    883
    ho già provato questo
    doc.insertString(doc.getLength(), testo, null);
    che uso anche da altre parti
    Ma si blocca sempre in quel punto
    Non eccede, sembra che sia dentro un loop
    Non so veramente che pesci prendere

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,305
    Ma il risultato del System.out.println() precedente appare?


    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

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    883
    si appare
    si blocca a editor.settext
    quindi non compare mai la scritta FINE

  7. #7
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Il problema POTREBBE dipendere dal fatto che molti componenti swing, compreso il JTextPane, sono thread safe, ovvero hanno incorporati dei meccanismi di protezioni per evitare che possano essere modificati in modo concorrente da piu thread producendo risulati inconsistenti. In particolare i componenti di un'interfaccia grafica non dovrebbero essere modificati da thread diversi da quello che si occupa di fare il dispatching degli eventi dell'interfaccia grafica stessa: nel tuo caso potrebbe darsi che il thread dell'interfaccia grafica stabilisce un lock sul JTextPane, cosi quando tu cerchi di settargli il testo, il tuo thread rimane bloccato in modo definitivo. Per sapere come lavorare con i thread e i componenti grafici prova a leggere qua:

    http://java.sun.com/products/jfc/swi...e/threads.html

  8. #8
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    883
    Ho letto un pò di cose nel link postato da anx
    In effetti sembra proprio che sia un problema di accesso da parte di più thread ad una stessa risorsa (l'editor) che causa stallo
    Però non riesco a capire come risolvere il problema.
    Faccio un breve riassunto:

    L'utente apre per la prima volta il programma swing quindi abbiamo un primo thread attivo

    Thread 1: gestisce l'applicazione swing

    Una volta attiva, l'applicazione lancia un secondo thread che rimane costantemente in ascolto su una porta.
    Quindi la stuazione è la seguente:

    Thread 1: gestisce l'applicazione swing
    Thread 2: in ascolto

    L'utente apre un secondo file, viene mandato il nome del file al thread 2 che, letto il file, deve visualizzare il testo letto nell'applicazione gestita dal thread 1. Per fare questo chiama il metodo

    TextEditor editor.setText(text);
    (TextEditor estende JTextPane)

    Il programma si blocca.
    La domanda è, il programma si blocca perchè Thread2 tenta di utilizzare l'oggetto editor, oggetto che è sotto il controllo di Thread1?

    Se è corretto, come cappero posso risolvere la situazione?

  9. #9
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    883
    il problema non sembra semplice

    http://spin.sourceforge.net/

  10. #10
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    hai provato con invokelater?

    e poi perche hai deciso di strutturare la cosa con i thread?

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