none
VB C# Tragamonedas RRS feed

  • 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
    miércoles, 3 de agosto de 2016 1:45

Respuestas

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

    miércoles, 3 de agosto de 2016 12:15
  • 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

    miércoles, 3 de agosto de 2016 13:16
  • 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!

    jueves, 4 de agosto de 2016 3:51
  • añadi esto al DoWork y funciono:

                        if (backgroundWorker1.CancellationPending == true)
                        {
                            e.Cancel = true;
                            break;
                        }

    gracias!!!!

    saludos!

    jueves, 4 de agosto de 2016 4:23