C sharp - Problemas con Listboxs en Threads

   
Vista:

Problemas con Listboxs en Threads

Publicado por Milán (4 intervenciones) el 25/03/2011 05:14:12
Estoy haciendo un programa para la escuela con Hilos (Threads) para meter datos randomizados en 3 listbox donde cada listbox es un Thread y esos numeros random quiero que los muestre en el listbox y si es 0 que mande un mensaje diciendo que salió cero y después el programa se cierre, pero el problema no es ese sino que no muestra datos en los listbox, probé haciendo un for en el button1_Click y llenando la lista desde ahí y si funciona pero al querer llenarla desde el Thread no lo hace, espero que puedan ayudarme por que es para mañana y creanme... llevo horas intentando pero no doy, Gracias.

Aquí dejo el código

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public void button1_Click(object sender, EventArgs e)
{
Random r2 = new Random();
BackgroundTest Test = new BackgroundTest();
BackgroundTest canada = new BackgroundTest();
Thread hilo1 = new Thread(new ThreadStart(canada.Canada));
BackgroundTest mexico = new BackgroundTest();
Thread hilo2 = new Thread(new ThreadStart(mexico.Mexico));
BackgroundTest japon = new BackgroundTest();
Thread hilo3 = new Thread(new ThreadStart(japon.Japon));

hilo1.Start();
hilo2.Start();
hilo3.Start();
}
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
}

class BackgroundTest : Form1
{
public void Canada()
{
Random r2 = new Random();
for (int h = 0; h < 2000; h++)
{
int r3 = r2.Next(100);
if (r3 == 0)
{
MessageBox.Show("Temperatura 0 en Canada");
this.Close();
}
string r4 = Convert.ToString(r3);
Convert.ToString(r3);
listBox1.Items.Add(r4);
Thread.Sleep(400);
listBox1.Refresh();
}
}

public void Mexico()
{
Random random = new Random();
for (int i = 0; i < 2000; i++)
{
int w = random.Next(100);
if (w == 0)
{
MessageBox.Show("Temperatura 0 en Mexico");
this.Close();
}
string a = Convert.ToString(w);
//MessageBox.Show("Mexico Vale: " + a);
Thread.Sleep(400);
listBox2.Refresh();
}
}

public void Japon()
{
Random random = new Random();
for (int i = 0; i < 2000; i++)
{
listBox3.Refresh();
int r = random.Next(500);
if (r == 0)
{
listBox3.Refresh();
MessageBox.Show("Temperatura 0 en Japon");
this.Close();
}
string c = Convert.ToString(r);
Thread.Sleep(600);
listBox3.Refresh();
}
}
}
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Problemas con Listboxs en Threads

Publicado por Milán (4 intervenciones) el 25/03/2011 07:47:43
Olvidenlo, ya lo arreglé...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve

Problemas con Listboxs en Threads

Publicado por xve (30 intervenciones) el 25/03/2011 08:21:44
Hola Milán, nos puedes comentar donde estaba el problema?

gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problemas con Listboxs en Threads

Publicado por Milán (4 intervenciones) el 25/03/2011 08:31:35
Pues primero que nada el código que puse tiene otros errores pero no hablaré de ellos, sino el problema por el cual vine a este foro.

Primero que nada el error estaba en que hice una clase aparte llamada

class BackgroundTest : Form1

y dentro de esa clase hice mis funciones, y se me ocurrió poner esas funciones dentro de la clase principal, osea esta:

public partial class Form1 : Form

llamé los Threads desde ahí y Vualá, funcionó aunque no se porque no ingresa los datos llamandolos desde una clase fuera, pero bueno al menos mi problema ya se solucionó pero no del todo... porque se supone que los 3 listbox tienen que llenarse en "paralelo" y no veo que lo haga, primero se llena dependiendo del orden del hilo y estoy tratando de ver cual es el problema y parece que me llevará tiempo ya que es la primera vez que uso hilos y bueno mi código de momento está asi:

public partial class Form1 : Form
{
bool canada = false;
bool mexico = false;
bool japon = false;

public Form1()
{
InitializeComponent();

}
public void button1_Click(object sender, EventArgs e)
{
Random r2 = new Random();
new Thread(Canada).Start();
new Thread(Mexico).Start();
new Thread(Japon).Start();


Canada();
Mexico();
Japon();




}
public void Canada()
{
int r3;
Random r2 = new Random();
do
{
r3 = r2.Next(100);
/*if ((mexico == true)||(japon == true))
{
Thread.CurrentThread.Abort();
}*/

/*if (r3 == 0)
{
//MessageBox.Show("Temperatura 0 en Canada");
canada = true;
//Application.Exit();
}*/
string r4 = Convert.ToString(r3);
Convert.ToString(r3);
try
{

listBox1.Items.Add(r4);
listBox1.Refresh();
//Thread.Sleep(300);
}
catch (InvalidOperationException)
{

}


}
while (r3 != 0);
}
public void Mexico()
{
int w;
Random random = new Random();
do
{
w = random.Next(50);

/* if (w == 0)
{
//MessageBox.Show("Temperatura 0 en Mexico");
mexico = true;
//Application.Exit();
}*/
string a = Convert.ToString(w);
try
{
listBox2.Items.Add(a);
listBox2.Refresh();
//Thread.Sleep(300);
}

catch (InvalidOperationException )
{

}
/* if ((canada == true) || (japon == true))
{
Thread.CurrentThread.Abort();
} */
}
while (w != 0);
}
public void Japon()
{
int r;
Random random = new Random();
do
{
//listBox3.Refresh();

r = random.Next(20);
/*if (r == 0)
{
//MessageBox.Show("Temperatura 0 en Japon");
japon = true;
//Application.Exit();
}*/
string c = Convert.ToString(r);
try
{
listBox3.Items.Add(c);
listBox3.Refresh();
//Thread.Sleep(300);
}
catch (InvalidOperationException)
{

}
/*if ((mexico == true)||(canada == true))
{
Thread.CurrentThread.Abort();
}*/

}
while (r != 0);
}
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
}


}

//Comente un par de Lineas para que se vea la forma en que se llenan las listas
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve

Problemas con Listboxs en Threads

Publicado por xve (30 intervenciones) el 25/03/2011 09:02:25
Muchas gracias Milán!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Programa Terminado

Publicado por Milán (4 intervenciones) el 25/03/2011 09:49:54
Por fin! Terminé el programa y después de todo era bastante fácil :S, pero como nadie me ayudó si me parecia muy dificil, Volveré a explicar lo que hace el programa, hay 3 listbox y 2 botones, 1 boton genera numeros aleatorios y estos se llenan en las listbox, el otro boton simplemente limpia las listbox, cuando presionamos el boton1 y genera un numero 0, indica que salió y en que Thread (Canada, México o Japón).. y eso es todo...

PD: Saludos al ITESA =) y saludos al Ing. Martín y si esta viendo esto "No lo Copié!, lo hice yo solito sin ayuda de nadie jaja"

Bueno Aquí el Codigo....

public partial class Form1 : Form
{
bool canada = false;
bool mexico = false;
bool japon = false;

public Form1()
{
InitializeComponent();

}
public void button1_Click(object sender, EventArgs e)
{
Random r2 = new Random();
new Thread(Canada).Start();
new Thread(Mexico).Start();
new Thread(Japon).Start();

do
{
Canada();
Mexico();
Japon();
}
while ((canada == false) || (mexico == false) || (japon == false));

}
public void Canada()
{
int r3;
Random r2 = new Random();

r3 = r2.Next(100);

if (r3 == 0)
{
MessageBox.Show("Temperatura 0 en Canada");

japon = true;
canada = true;
mexico = true;

}
string r4 = Convert.ToString(r3);
Convert.ToString(r3);
try
{

listBox1.Items.Add("Grados: " +r4);
listBox1.Refresh();
Thread.Sleep(200);
}
catch (InvalidOperationException)
{

}
catch (NullReferenceException)
{

}

}
public void Mexico()
{
int w;
Random random = new Random();

if ((japon == true) && (canada == true))
{
Thread.CurrentThread.Abort();
}
try
{
listBox2.Refresh();
}
catch (InvalidOperationException)
{

}
w = random.Next(50);

if (w == 0)
{
MessageBox.Show("Temperatura 0 en Mexico");
japon = true;
canada = true;
mexico = true;

}
string a = Convert.ToString(w);
try
{

listBox2.Items.Add("Grados: " +a);
listBox2.Refresh();
Thread.Sleep(200);
}

catch (InvalidOperationException )
{

}

}
public void Japon()
{
int r;
Random random = new Random();

try
{
listBox3.Refresh();
}
catch (InvalidOperationException)
{

}

r = random.Next(20);
if (r == 0)
{
MessageBox.Show("Temperatura 0 en Japon");

japon = true;
canada = true;
mexico = true;

}
string c = Convert.ToString(r);
try
{
listBox3.Items.Add("Grados: "+c);
listBox3.Refresh();
Thread.Sleep(200);
}
catch (InvalidOperationException)
{

}
if ((mexico == true)&&(canada == true))
{
Thread.CurrentThread.Abort();
}

}
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
}

private void button2_Click(object sender, EventArgs e)
{
inicio:
try
{
listBox1.Items.Clear();
listBox2.Items.Clear();
listBox3.Items.Clear();
}
catch (NullReferenceException)
{
goto inicio;
}
}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar