• Viernes 19 de Abril de 2024, 23:27

Autor Tema:  Multi Thread y referencias a otro objeto desde otra clase  (Leído 1881 veces)

portirijillo

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Multi Thread y referencias a otro objeto desde otra clase
« en: Viernes 12 de Julio de 2013, 20:28 »
0
Saludos.
Me gusta programar en lenguaje Java, pero ha surgido la necesidad de crear un programa escrito en C#. Pero tengo un problema en el uso de multi threads (multi hilos), ahora les explico como era en java.

Si en java queria hace un contador y que se reflejara en un JLabel, hacia lo siguiente.
Código: [Seleccionar]
class Frame extends JFrame {
    JPanel panel;
    JLabel label;
    public Frame() {
        inicializarTodo();
    }

    public void contador() {
Controlador x = new Controlador(this.label);
new Thread(x).start();
}
}

//Segunda clasee
class Controlador implements Runnable {
JLabel label;

public Controlador(JLabel label) {
this.label = label;
}

public void run() {
/*inicializar x e y*/
...
int contador = 0;
while(true) {
x++; y++;
label.setLocation(x,y); //Aqui hago entender que el label se movera por todo el JFrame
label.setText("" + contador);
contador++;
}
}
}

Pongo ese ejemplo porque creo seria mas entendible a que coloque en concreto mi problema que se resolveria de igual forma.
Ahora en C# no puedo mandar la referencia de un componente a otra clase y modificar sus propiedades al ejecutar un nuevo Thread porque aparece una exepcion sobre Cross-thread.

A lo que mi pregunta es como se haria eso de Java en C#, requiero que quede asi puesto a que mi clase controlador divide la tarea importante para mover y modificar componentes del windows form.

Cualquier ayuda les agradezco.

U2_Caparzo

  • Miembro activo
  • **
  • Mensajes: 45
  • Nacionalidad: cl
  • Super duper divertido xDD
    • Ver Perfil
Re:Multi Thread y referencias a otro objeto desde otra clase
« Respuesta #1 en: Viernes 12 de Julio de 2013, 23:15 »
0
La verdad no se si hay maneras mas 'fáciles' de hacerlo, quizás algún miembro con mas experiencia pueda ayudarte más, te daré un pequeño ejemplo, explica más que 1000 palabras.

supondremos que hay un label en el form que se llama "label1"

Código: [Seleccionar]
public delegate void InvocacionCrossThread(string valor);
class form1 : Form
{
     public void ActualizarLabel1(string texto)
     {
          if(this.InvokeRequired)
          {
               InvocacionCrossThread actualizador = ActualizarLabel1();
               this.Invoke(actualizador, texto);
          }
          else
               label1.Text = texto;
     }
}
Lo dificil se hace... lo imposible se intenta
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.(Frase de Albert Einstein)