none
Bloqueo del programa si… RRS feed

  • Pregunta

  • No comprendo por qué mi programa se me bloquea si empiezo a ejecutarlo por un Form específico x. En cambio, si voy primero al Form a, b, c… o cualquier otro, sí puedo acceder después a x sin problema sin que se bloquee el programa. Uso Visual Basic 2010. Si alguien me puede ayudar, se lo agradecería.

    viernes, 25 de marzo de 2016 21:51

Respuestas

  • Correcto.  Realice una depuración línea por línea para determinar en qué parte del código se pega.  Ya con la línea identificada podríamos ayudarle mejor.

    Jose R. MCP
    Code Samples

    viernes, 25 de marzo de 2016 23:29
  • No, no creo que esté ahí el problema.

    En realidad en el código obtengo las palabras del array randomOrdered  que es una copia del array palabra ordenado de forma aleatoria:

    Dim randomOrdered = palabra.OrderBy(Function(x) Rnd()).ToArray()
    

    Creo que el problema viene porque, por lo que veo en tu código, en el array MiArray donde mantienes los Labels éstos empiezan a partir del índice 1 en lugar del índice 0.

    Habría que modificar el código para tener en cuenta esta posibilidad utilizando dos índices diferentes, uno para cada array:

            Dim randomOrdered = palabra.OrderBy(Function(x) Rnd()).ToArray()
            Dim i = 0, j=0
            While i < MiArray.Length AndAlso j < randomOrdered.Length
                If MiArray(i) Is Nothing Then
                    i += 1
                Else 
                    MiArray(i).Text = randomOrdered(j)
                End If
            End While
    


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    lunes, 28 de marzo de 2016 1:35
  • Asier, he probado con tu nuevo código, pero hemos vuelto a las andadas: que el programa se bloquea. Por eso, no te molestes ya que, aunque no sea mi solución tal vez la más correcta, al menos el programa funciona. Muchas gracias.

    lunes, 28 de marzo de 2016 8:15

Todas las respuestas

  • No programo VB.net pero sí sé de Windows Forms.  Para poder ayudarle necesitamos que muestre código.  Pero claro, no le sé decir cuál exactamente con la descripción que nos da.  Entonces tal vez antes de pedirle que muestre algo, le recomiendo depurar su aplicación.  Tiene que haber algo distinto en ese form x que no tienen los demás.

    Jose R. MCP
    Code Samples

    viernes, 25 de marzo de 2016 22:28
  • Gracias por tu respuesta. Perdona, el código es demasiado largo, por lo que no creo sea conveniente el mostrarlo. La compilación se muestra correcta. Y sí, ese form tiene cosas distintas (por eso es otro form), lo que no entiendo es que no funcione si es el primero que ejecuto y sí funciona si lo ejecuto en el menú después de otro.
    viernes, 25 de marzo de 2016 22:44
  • Correcto.  Realice una depuración línea por línea para determinar en qué parte del código se pega.  Ya con la línea identificada podríamos ayudarle mejor.

    Jose R. MCP
    Code Samples

    viernes, 25 de marzo de 2016 23:29
  • Tal como me insinuó, he realizado una depuración línea a línea y veo que donde realiza un bucle sin fin (de no empezar por otro form) es en este For - Next. Creo que no hace falta explicar para qué lo realizo pues en lo que en realidad está el problema es precisamente en que sí funcione cuando lo ejecuto tras otro form, no dependiendo además las variables sino de este. Aquí expongo el bucle en cuestión:

            For Me.a = 1 To 12

                Randomize()

                azar = Int((12 * Rnd()) + 1)

                If a = 1 Then MiArray(a).Text = palabra(azar)

                orden(a) = azar

                For b = 1 To (a - 1)

                    If MiArray(b).Text = palabra(azar) Then

                        a = a - 1

                        Exit For

                    Else

                        MiArray(a).Text = palabra(azar)

                        orden(a) = azar

                    End If

                Next

            Next

    sábado, 26 de marzo de 2016 11:06
  • Después de muchas vueltas y búsquedas en Internet, he solucionado el problema intercalando un simple - 1 + 1 a la hora de sacar números aleatorios entre 1 y 12. De todos modos, sigo sin entender ahora el motivo de esta solución.

    Antes:  Int((12 * Rnd()) + 1)

    Ahora: Int((12 - 1 + 1) * Rnd() + 1)


    sábado, 26 de marzo de 2016 13:28
  • No creo que su problema esté resuelto por eso.  Lo que creo es que la lógica del 2do bucle FOR está echando la variable a hacia atrás y haciendo que el bucle FOR externo nunca  termine.  Creo que debería replantearse la lógica de estos bucles.

    Jose R. MCP
    Code Samples


    • Editado webJose sábado, 26 de marzo de 2016 15:58
    sábado, 26 de marzo de 2016 15:58
  • Sí, estoy de acuerdo con lo que me dice que tal vez el problema no esté bien resuelto, de ahí mi incomprensión de por qué así sí funciona. Y respecto a la posibilidad de replantearme el bucle FOR no sé cómo hacerlo. Si hay nuevas ideas, se agradecen.

    sábado, 26 de marzo de 2016 18:22
  • Hola Francisco,

    para poder proponerte una implementación alternativa para tu código habría que saber qué es exactamente lo que pretendes hacer con él.


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    sábado, 26 de marzo de 2016 18:35
  • Hola, Asier. Lo que trato es que el usuario vaya arrastrando cada una de las 12 palabras (en unos label) a otro lugar correspondiente (otros label) frente a su palabra opuesta. Pero pretendo que esos antónimos vayan saliendo de forma aleatoria y cada vez distinta y que se vayan guardando en palabra(azar). Gracias.

    sábado, 26 de marzo de 2016 18:48
  • Entonces creo que podría servirte algo así:

            Dim randomOrdered = palabra.OrderBy(Function(x) Rnd()).ToArray()
            Dim i = 0
            While i < MiArray.Length AndAlso i < randomOrdered.Length
                MiArray(i).Text = randomOrdered(i)
            End While

    Primero creo un array con las palabras ordenadas de forma aleatoria y en el While voy asignándoselas a cada Label.


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...


    domingo, 27 de marzo de 2016 8:11
  • Asier, he cambiado todo mi For - Next por las líneas de tu código, pero al ejecutarlo, tras la línea MiArray(i).Text = randomOrdered(i) me aparece un "No se controló NullReferenceException". Por otra parte, yo en otros lugares del Form hago referencia a palabra(x) y en tu código al parecer esta no se carga. ¿Será ese el motivo y tendré que sustituirla por otra distinta de tu código? Gracias.

    domingo, 27 de marzo de 2016 10:47
  • No, no creo que esté ahí el problema.

    En realidad en el código obtengo las palabras del array randomOrdered  que es una copia del array palabra ordenado de forma aleatoria:

    Dim randomOrdered = palabra.OrderBy(Function(x) Rnd()).ToArray()
    

    Creo que el problema viene porque, por lo que veo en tu código, en el array MiArray donde mantienes los Labels éstos empiezan a partir del índice 1 en lugar del índice 0.

    Habría que modificar el código para tener en cuenta esta posibilidad utilizando dos índices diferentes, uno para cada array:

            Dim randomOrdered = palabra.OrderBy(Function(x) Rnd()).ToArray()
            Dim i = 0, j=0
            While i < MiArray.Length AndAlso j < randomOrdered.Length
                If MiArray(i) Is Nothing Then
                    i += 1
                Else 
                    MiArray(i).Text = randomOrdered(j)
                End If
            End While
    


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    lunes, 28 de marzo de 2016 1:35
  • Asier, he probado con tu nuevo código, pero hemos vuelto a las andadas: que el programa se bloquea. Por eso, no te molestes ya que, aunque no sea mi solución tal vez la más correcta, al menos el programa funciona. Muchas gracias.

    lunes, 28 de marzo de 2016 8:15