Principales respuestas
VB C# Tragamonedas

Pregunta
-
saludos!!!
estoy haciendo mi proyecto final que es un tragamonedas, y estoy en el cambio de imagen del juego, El Profesor me pidio que no Usara un Timer que usara un BackGroundWorker, entonces programe lo siguiente:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { int i = 1; while ( i > 0 ) { imagen1 = objeto.Next(0, 3); n1 = Convert.ToString(imagen1); if (imagen1 == 0) { pictureBox1.Image = Traga_monedas_frutas.Properties.Resources.Banana; } else if (imagen1 == 1) { pictureBox1.Image = Traga_monedas_frutas.Properties.Resources.Manzana; } else if (imagen1 == 2) { pictureBox1.Image = Traga_monedas_frutas.Properties.Resources.Pina; } else if (imagen1 == 3) { pictureBox1.Image = Traga_monedas_frutas.Properties.Resources.Cereza; } i++; } }
inicio el subproceso con:
private void button1_Click(object sender, EventArgs e) { backgroundWorker1.RunWorkerAsync(); }
y me da el siguiente error al correr el proyecto
El Codigo de usuario no encontro InvalidOperationException
como podria arreglarlo??
- Editado Gerarca miércoles, 3 de agosto de 2016 1:46
Respuestas
-
añadi esto al DoWork y funciono:
if (backgroundWorker1.CancellationPending == true) { e.Cancel = true; break; }
gracias!!!!
saludos!
- Marcado como respuesta Laura CeglzModerator jueves, 4 de agosto de 2016 16:23
Todas las respuestas
-
hola
No puedes desde el evento DoWork acceder a los controles del form ya que en ese evento estas operando en un thread separado
en el DoWork podrias seleccionar que imagen se muestra, pero es en el RunWorkerCompleted donde puedes asignarla a los picturebox
saludos
Leandro Tuttini
Blog
MVP Profile
Buenos Aires
Argentina -
Como lo indica Alejandro no se puede modificar controles dentro de backgroungworker, pero si podrias reportar un progreso para hacer la modificacion de la imagen algo asi:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
int i = 1;
while ( i > 0 )
{
imagen1 = objeto.Next(0, 3);
n1 = Convert.ToString(imagen1);
backgroundWorker1.ReportProgress(imagen1);
i++;
}
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
if (e.ProgressPercentage == 0)
{
pictureBox1.Image = Traga_monedas_frutas.Properties.Resources.Banana;
}
else
if (e.ProgressPercentage == 1)
{
pictureBox1.Image = Traga_monedas_frutas.Properties.Resources.Manzana;
}
else
if (e.ProgressPercentage == 2)
{
pictureBox1.Image = Traga_monedas_frutas.Properties.Resources.Pina;
}
else
if (e.ProgressPercentage == 3)
{
pictureBox1.Image = Traga_monedas_frutas.Properties.Resources.Cereza;
}
}Nota: para que funcione el reporte de progreso debes activar la propiedad WorkerReportsProgress del backgroundWorker.
Saludos
Harold
Harold Chia
-
lo puede arreglar, cambiando el codigo por completo, aqui les muestro una imagen del juego para que tengan una idea:
en cada picturebox tengo un backgroundworker, la pregunta es que inicio el backgroundworker con backgroundWorker1.RunWorkerAsync(); cuando clikeo en el botom Start pero cuando lo voy a detener el backgroundworer al clikear en el boton azul uso backgroundWorker1.CancelAsync(); no se detiene, sigue cambiando las imagenes, que estoy haciendo mal??
saludos!
-
añadi esto al DoWork y funciono:
if (backgroundWorker1.CancellationPending == true) { e.Cancel = true; break; }
gracias!!!!
saludos!
- Marcado como respuesta Laura CeglzModerator jueves, 4 de agosto de 2016 16:23