Foros del Web » Programación para mayores de 30 ;) » Java »

Interface se bloquea o Invalid thread access

Estas en el tema de Interface se bloquea o Invalid thread access en el foro de Java en Foros del Web. Hola a todos, Estoy empezando con java y lo que a simple vista parece muy sencillo no hay manera de hacerlo, se trata de un ...
  #1 (permalink)  
Antiguo 09/02/2015, 15:56
 
Fecha de Ingreso: octubre-2009
Mensajes: 47
Antigüedad: 14 años, 6 meses
Puntos: 0
Interface se bloquea o Invalid thread access

Hola a todos,

Estoy empezando con java y lo que a simple vista parece muy sencillo no hay manera de hacerlo, se trata de un simple ejemplo, lo que quiero hacer es que cuando pulse el botón se actualice el valor del campo de 0 a 100000 pero sin que bloque la interface y pueda ver como se actualiza hasta acabar la tarea.

El caso es que recibo el error "Invalid thread access" y si trato de usar "Display.getDefault().asyncExec..." se bloquea la interface hasta que finaliza.

Alguna sugerencia ante mi dilema?

Gracias

Código:
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;

public class Example
{
protected Shell shell;
private Text text;
static int count = 0;

public static void main(String[] args)
 {
 try
  {
  Example window = new Example();
  window.open();
  }
 catch(Exception e)
  {
  e.printStackTrace();
  }
 }

public void open()
 {
 Display display = Display.getDefault();
 createContents();
 shell.open();
 shell.layout();
 while(!shell.isDisposed())
  {
  if(!display.readAndDispatch())
   {
   display.sleep();
   }
  }
 }

protected void createContents()
 {
 shell = new Shell();
 shell.setSize(450, 300);
 shell.setText("SWT Application");
		
 text = new Text(shell, SWT.BORDER);
 text.setBounds(10, 10, 76, 21);
		
 Button btnNewButton = new Button(shell, SWT.NONE);
 btnNewButton.addSelectionListener(new SelectionAdapter()
  {
  @Override
  public void widgetSelected(SelectionEvent e)
   {
   Thread newThread = new Thread(new Runnable()
    {
    @Override
    public void run()
     {
     for(int i = 0; i < 100000; ++i)
      {
      text.setText(count + "");
      ++count;
      }
     }
    });
   newThread.start();
   }
  });
 btnNewButton.setBounds(94, 10, 75, 25);
 btnNewButton.setText("New Button");
 }
}
  #2 (permalink)  
Antiguo 10/02/2015, 14:34
 
Fecha de Ingreso: octubre-2009
Mensajes: 47
Antigüedad: 14 años, 6 meses
Puntos: 0
Respuesta: Interface se bloquea o Invalid thread access

Me respondo a mi mismo, el primer ejemplo que expuse lo genere como Application Windows y este otro ejemplo que si que consigo que haga efecto que busco que es ejecutar otro hilo en paralelo con acceso a los objetos de la interface lo abro como JFrame

Código:
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;


public class Example extends JFrame
{
private JPanel contentPane;
private JTextField textField;
static int count = 0;

public static void main(String[] args)
 {
 EventQueue.invokeLater(new Runnable()
  {
  public void run()
   {
   try
    {
    Example frame = new Example();
    frame.setVisible(true);
    }
   catch(Exception e)
    {
    e.printStackTrace();
    }
   }
  });
 }

public Example()
 {
 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 setBounds(100, 100, 450, 300);
 contentPane = new JPanel();
 contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
 setContentPane(contentPane);
 contentPane.setLayout(null);
 
 textField = new JTextField();
 textField.setText("");
 textField.setBounds(10, 11, 86, 20);
 contentPane.add(textField);
 textField.setColumns(10);
 
 JButton btnNewButton = new JButton("New button");
 btnNewButton.addActionListener(new ActionListener()
  {
  public void actionPerformed(ActionEvent arg0)
   {
	  
   Thread newThread = new Thread(new Runnable()
    {
    @Override
    public void run()
     {
     for(int i = 0; i < 100000; ++i)
      {
      textField.setText(count + "");
      ++count;
      }
     }
    });
   newThread.start();
   
   }
  });
 btnNewButton.setBounds(106, 10, 89, 23);
 contentPane.add(btnNewButton);
 }
}

Etiquetas: access, interface, invalid, valor
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:22.