none
detener bucle con un click

    Question

  • hola

    sabe alguien si se puede detener un bucle ya sea do loop o for  haciendo click  o deselecionando un checkbox

    me explico

    yo puedo selecionar hasta tres checkboxes , y estos al estar en checked=true ejecutan un bucle de lectura , al deseleccionar todos y solo si son los que estan en checked=false , querria que se parara el bucle de lectura .

    ¿ es esto posible ?

    he buscado por web y no he visto nada

    do

    if checkbox1.checked=false then

    exit do

    end if

    'proceso de lectura

    doop

    gracias

     

    Tuesday, December 06, 2011 7:03 PM

Answers

  • "zocopeo" preguntó:

    > sabe alguien si se puede detener un bucle ya sea do loop o for
    > haciendo click  o deselecionando un checkbox
    >
    > me explico
    >
    > yo puedo selecionar hasta tres checkboxes , y estos al estar en
    > checked=true ejecutan un bucle de lectura , al deseleccionar todos
    > y solo si son los que estan en , querria que se
    > parara el bucle de lectura .
    >
    > ¿ es esto posible ?

    Hola:

    Es posible siempre y cuando ejecutes el bucle en un subproceso, thread o "hilo" diferente al subproceso principal del proyecto, porque te habrás dado cuenta que no te dejará marcar/desmarcar el control CheckBox mientras se está ejecutando el bucle Do ... Loop.

    Prueba a ejecutar el bucle en un método privado:

        Private Sub RecorrerBucle()

            Dim n As Int32

            Do
                ' proceso de lectura
                '
                '
                ' Escribimos en la consola, para comprobar
                ' que el bucle se está ejecutando.
                '
                n += 1
                Console.WriteLine(n)

            Loop Until (Not (CheckBox1.Checked))

            MessageBox.Show(CheckBox1.Checked.ToString())

        End Sub

    Y cuando desees que comienze a ejecutarse el bucle, hazlo de la siguiente manera:

        Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1.Click

            ' Iniciamos un nuevo hilo para ejecutar el bucle.
            '
            Dim newThread As New Threading.Thread(AddressOf RecorrerBucle)
            newThread.Start()

        End Sub

    Comprobarás que de ésta manera ya estás en condiciones de marcar/desmarcar los controles CheckBox, o cualquier otro control que tengas en tu formulario, porque el bucle se está ejecutando en otro subproceso diferente del subproceso principal.

    Un saludo


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.


    Tuesday, December 06, 2011 7:45 PM
  • No es lo más funcional, pero si añades un DoEvents en el interior del bucle, te dejará actuar sobre el Check, leer la respuesta y poder salir del bucle.


    Salu2,

    Víctor
    Para el correcto funcionamiento, y que otros usuarios se puedan beneficiar de la solucion de esta pregunta por favor marca las respuestas que te hayan ayudado como "Respuesta".
    Si la respuesta te ha sido util Votala.
    Wednesday, December 07, 2011 8:48 AM
  • Buenas compañeros.

    Utilizar un hilo para poder realizar lo que necesita sin duda es la solución, sin embargo el acceso a controles de la UI tiene sus riesgos, ya que no es seguro llamar a un control desde un subproceso distinto del que creó el control sin utilizar el método Invoke.

    Hay un ejemplo de cómo utilizar el método Invoke bastante interesante:

    http://msdn.microsoft.com/es-es/library/ms171728.aspx

    Tengo subido a la galería un proyecto que trabaja con BackgroundWorker y Delegates, los Delegates también pueden ayudar a acceder a controles de la UI de manera segura:

    http://code.msdn.microsoft.com/BackGroundWorker-25598fff

    Un saludo.


    Antonio López Atienza
    Microsoft Community Contributor
    .NET Developer
    Code examples
    http://www.lopezatienza.es
    Wednesday, December 07, 2011 9:17 AM
  • Hola, también puedes probar haciendo uso de BackGroundWorker, mandas a ejecutar tu bucle en el Evento DoWork del Control BackGroundWorker, y para detener todo lo cancelas con CancelAsync. 

    http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

    Saludos


    By Steve Morrison
    Thursday, December 08, 2011 4:56 AM

All replies

  • "zocopeo" preguntó:

    > sabe alguien si se puede detener un bucle ya sea do loop o for
    > haciendo click  o deselecionando un checkbox
    >
    > me explico
    >
    > yo puedo selecionar hasta tres checkboxes , y estos al estar en
    > checked=true ejecutan un bucle de lectura , al deseleccionar todos
    > y solo si son los que estan en , querria que se
    > parara el bucle de lectura .
    >
    > ¿ es esto posible ?

    Hola:

    Es posible siempre y cuando ejecutes el bucle en un subproceso, thread o "hilo" diferente al subproceso principal del proyecto, porque te habrás dado cuenta que no te dejará marcar/desmarcar el control CheckBox mientras se está ejecutando el bucle Do ... Loop.

    Prueba a ejecutar el bucle en un método privado:

        Private Sub RecorrerBucle()

            Dim n As Int32

            Do
                ' proceso de lectura
                '
                '
                ' Escribimos en la consola, para comprobar
                ' que el bucle se está ejecutando.
                '
                n += 1
                Console.WriteLine(n)

            Loop Until (Not (CheckBox1.Checked))

            MessageBox.Show(CheckBox1.Checked.ToString())

        End Sub

    Y cuando desees que comienze a ejecutarse el bucle, hazlo de la siguiente manera:

        Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1.Click

            ' Iniciamos un nuevo hilo para ejecutar el bucle.
            '
            Dim newThread As New Threading.Thread(AddressOf RecorrerBucle)
            newThread.Start()

        End Sub

    Comprobarás que de ésta manera ya estás en condiciones de marcar/desmarcar los controles CheckBox, o cualquier otro control que tengas en tu formulario, porque el bucle se está ejecutando en otro subproceso diferente del subproceso principal.

    Un saludo


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.


    Tuesday, December 06, 2011 7:45 PM
  • Interesante tu respuesta SoftJaen, me sirve a mi también. Me voy a poner a investigar un poco. Muchas gracias.
    Santiago Ezequiel Rueda
    santiagorueda@live.com.ar

    Entre Ríos
    Argentina
    Tuesday, December 06, 2011 10:13 PM
  • No es lo más funcional, pero si añades un DoEvents en el interior del bucle, te dejará actuar sobre el Check, leer la respuesta y poder salir del bucle.


    Salu2,

    Víctor
    Para el correcto funcionamiento, y que otros usuarios se puedan beneficiar de la solucion de esta pregunta por favor marca las respuestas que te hayan ayudado como "Respuesta".
    Si la respuesta te ha sido util Votala.
    Wednesday, December 07, 2011 8:48 AM
  • Buenas compañeros.

    Utilizar un hilo para poder realizar lo que necesita sin duda es la solución, sin embargo el acceso a controles de la UI tiene sus riesgos, ya que no es seguro llamar a un control desde un subproceso distinto del que creó el control sin utilizar el método Invoke.

    Hay un ejemplo de cómo utilizar el método Invoke bastante interesante:

    http://msdn.microsoft.com/es-es/library/ms171728.aspx

    Tengo subido a la galería un proyecto que trabaja con BackgroundWorker y Delegates, los Delegates también pueden ayudar a acceder a controles de la UI de manera segura:

    http://code.msdn.microsoft.com/BackGroundWorker-25598fff

    Un saludo.


    Antonio López Atienza
    Microsoft Community Contributor
    .NET Developer
    Code examples
    http://www.lopezatienza.es
    Wednesday, December 07, 2011 9:17 AM
  • "lopezatienza" escribió:

    > Utilizar un hilo para poder realizar lo que necesita sin duda es
    > la solución, sin embargo el acceso a controles de la UI tiene sus
    > riesgos, ya que no es seguro llamar a un control desde un
    > subproceso distinto del que creó el control sin utilizar el
    > método Invoke.

    Hola, Antonio:

    Efectivamente, así es. Pero desde luego, lo más idóneo es evitar por todos los medios posible acceder a un control de la IU desde otro subproceso distinto al que fue creado, sobre todo para modificar los valores de sus propiedades, porque de poder hacerse, mejor sería que nos dedicáramos a otros menesteres. :-(

    El trabajar con subprocesos secundarios entiendo que es para realizar en segundo plano tareas no principales que puedan demorarse en el tiempo, pero no para escribir texto en un control TextBox, ni para cambiar la propiedad Checked de un control CheckBox, porque entonces no hay más remedio que recurrir a algunas de las técnicas que has explicado.

    Pero ¡vamos! Que si simplemente es para averiguar si un control CheckBox está verificado o no para finalizar un bucle cualquiera que se está ejecutando en otro subproceso diferente, no creo que haya que echar mano de Delegados, controles BackgroundWorker ni de cualquier otra técnica relacionada con los subprocesos. ;-)

    Un saludo


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    Wednesday, December 07, 2011 11:34 AM
  • "Víctor González" escribió:

    > No es lo más funcional, pero si añades un DoEvents en el
    > interior del bucle, te dejará actuar sobre el Check, leer
    > la respuesta y poder salir del bucle.

    Hola, Víctor:

    Sí, podría ser una solución para salir del paso, pero desde luego no tan eficaz como ejecutar el bucle en otro subproceso diferente, porque dependiendo lo que se esté ejecutando en el bucle, puede que con Application.DoEvents la respuesta tampoco sea tan inmediata como para permitir que se procesen los restantes mensajes que actualmente se encuentran en la cola de mensajes.

    Sería cuestión de probar y ver los resultados, ya que es otra opción a tener en cuenta.

    Un saludo


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    Wednesday, December 07, 2011 11:45 AM
  • "lopezatienza" escribió:

    > Utilizar un hilo para poder realizar lo que necesita sin duda es
    > la solución, sin embargo el acceso a controles de la UI tiene sus
    > riesgos, ya que no es seguro llamar a un control desde un
    > subproceso distinto del que creó el control sin utilizar el
    > método Invoke.

    Hola, Antonio:

    Efectivamente, así es. Pero desde luego, lo más idóneo es evitar por todos los medios posible acceder a un control de la IU desde otro subproceso distinto al que fue creado, sobre todo para modificar los valores de sus propiedades, porque de poder hacerse, mejor sería que nos dedicáramos a otros menesteres. :-(

    El trabajar con subprocesos secundarios entiendo que es para realizar en segundo plano tareas no principales que puedan demorarse en el tiempo, pero no para escribir texto en un control TextBox, ni para cambiar la propiedad Checked de un control CheckBox, porque entonces no hay más remedio que recurrir a algunas de las técnicas que has explicado.

    Pero ¡vamos! Que si simplemente es para averiguar si un control CheckBox está verificado o no para finalizar un bucle cualquiera que se está ejecutando en otro subproceso diferente, no creo que haya que echar mano de Delegados, controles BackgroundWorker ni de cualquier otra técnica relacionada con los subprocesos. ;-)

    Un saludo


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    Sí, sin duda Enrique.

    Me he cruzado con algunas migraciones y mejoras de programas que he "heredado" en las que accedían desde hilos a controles de la UI que han funcionado años y nunca ha tenido problemas, seguramente porque era sólo acceso a propiedades como ReadOnly y no a modificación de estas.

    Era únicamente un comentario para hacerlo de una manera más segura, probablemente tu código no provoque ese tipo de excepción, es por aportar una información que me parece importante para el que se aventura en el magnífico mundo de los Threads.

    Un saludo!

    Un saludo.


    Antonio López Atienza
    Microsoft Community Contributor
    .NET Developer
    Code examples
    http://www.lopezatienza.es
    Wednesday, December 07, 2011 12:41 PM
  • hola

    leeo todo intento aclararme y les comento como me ha ido

    gracias a todos

     

    Wednesday, December 07, 2011 5:50 PM
  • "zocopeo" preguntó:

    > sabe alguien si se puede detener un bucle ya sea do loop o for
    > haciendo click  o deselecionando un checkbox
    >
    > me explico
    >
    > yo puedo selecionar hasta tres checkboxes , y estos al estar en
    > checked=true ejecutan un bucle de lectura , al deseleccionar todos
    > y solo si son los que estan en , querria que se
    > parara el bucle de lectura .
    >
    > ¿ es esto posible ?

    Hola:

    Es posible siempre y cuando ejecutes el bucle en un subproceso, thread o "hilo" diferente al subproceso principal del proyecto, porque te habrás dado cuenta que no te dejará marcar/desmarcar el control CheckBox mientras se está ejecutando el bucle Do ... Loop.

    Prueba a ejecutar el bucle en un método privado:

        Private Sub RecorrerBucle()

            Dim n As Int32

            Do
                ' proceso de lectura
                '
                '
                ' Escribimos en la consola, para comprobar
                ' que el bucle se está ejecutando.
                '
                n += 1
                Console.WriteLine(n)

            Loop Until (Not (CheckBox1.Checked))

            MessageBox.Show(CheckBox1.Checked.ToString())

        End Sub

    Y cuando desees que comienze a ejecutarse el bucle, hazlo de la siguiente manera:

        Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1.Click

            ' Iniciamos un nuevo hilo para ejecutar el bucle.
            '
            Dim newThread As New Threading.Thread(AddressOf RecorrerBucle)
            newThread.Start()

        End Sub

    Comprobarás que de ésta manera ya estás en condiciones de marcar/desmarcar los controles CheckBox, o cualquier otro control que tengas en tu formulario, porque el bucle se está ejecutando en otro subproceso diferente del subproceso principal.

    Un saludo


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.



    ok llevo 3h dandole vueltas y no lo entiendo , mira este es el codigo que ejecuto al hacer click en cualquiera de las  cinco checkboxes que tengo , y queria poder marcar un dos o  tres las cinco y que al desmarcar las tres se cortara el bucle,

     Private Sub BtParametrosDelphi1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckAnguloGiro.Click, CheckTension.Click, CheckSensor.Click, CheckEstadoMil.Click, BtParametrosDelphi1.Click

            Do
              

                Port1.Write("220948" & vbCrLf)
                leidos = Port1.ReadTo(">")
                byteTension = ""
                byteAngulo = ""
                TxtTension.Clear()
                TxtAngulo.Clear()

                byteTension = leidos.Substring(16, 2) 'leer byte 16 en dos caracteres
                byteAngulo = leidos.Substring(12, 4)
                byteTension = Convert.ToInt32(byteTension, 16) ' convierte en decimal
                byteAngulo = Convert.ToInt32(byteAngulo, 16)


                If CheckAnguloGiro.Checked = True Then
                    TxtAngulo.AppendText((byteAngulo) / 1000)
                End If
                If CheckEsfuerzo.Checked = True Then

                End If

                If CheckEstado.Checked = True Then

                End If
                If CheckSen.Checked = True Then
                End If

                If CheckTension.Checked = True Then
                    TxtTension.AppendText((byteTension) * 0.0625 & "V") ' tensiion de UCE

                End If
               

                ' Exit Do


            Loop

            ' BtParametrosDelphi1.Text = "Read"



        End Sub

     

    no se si de aqui se puede sacar algo y hacerlo como tu dices , ya tengo la cabeza muy liada

    gracias

    Thursday, December 08, 2011 1:15 AM
  • Hola, también puedes probar haciendo uso de BackGroundWorker, mandas a ejecutar tu bucle en el Evento DoWork del Control BackGroundWorker, y para detener todo lo cancelas con CancelAsync. 

    http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

    Saludos


    By Steve Morrison
    Thursday, December 08, 2011 4:56 AM
  • "zocopeo" escribió:

    > ok llevo 3h dandole vueltas y no lo entiendo ...
    > ya tengo la cabeza muy liada

    Pues despéjate la cabeza y pon bien atención, porque como estás ejecutando el bucle, ES IMPOSIBLE QUE PUEDAS HACER LO QUE DESEAS. Te lo puedo decir más alto, pero no más claro. :-)

    Te repito que el bucle lo tienes que ejecutar en un SUBPROCESO DISTINTO, y dentro de él, verificar las condiciones de los controles CheckBox para que puedas abandonar el bucle. Mientras no lo hagas así, estarás perdiendo el tiempo.

    Para que veas cómo funciona lo que te estoy comentando, comienza un nuevo proyecto de Visual Basic, y en el formulario de inicio coloca un control Button y cinco controles CheckBox.

    Copia/Pega el siguiente ejemplo en el código del formulario:

    Public Class Form1

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

            ' Iniciamos un nuevo hilo para ejecutar el bucle.
            '
            Dim newThread As New Threading.Thread(AddressOf RecorrerBucle)
            newThread.Start()

        End Sub

        Private Sub RecorrerBucle()

            Dim n As Int32

            Do
                ' Aquí, ejecutar las acciones que tengas que ejecutar.
                '
                ' ...

                ' Escribimos en la consola, para comprobar
                ' que el bucle se está ejecutando.
                '
                n += 1
                Console.WriteLine(n)

                ' Y aquí, tienes que comprobar el estado de los
                ' controles CheckBox que deseas verificar para
                ' abandonar o no el bucle. ¿Me explico?
                '
                ' Por ejemplo, si CheckBox1, CheckBox2 y CheckBox5
                ' están verificados, abandonamos el bucle, siempre
                ' y cuando no estén verificados los restantes
                ' controles CheckBox, es decir, CheckBox3 y CheckBox4.
                '
                If ((CheckBox1.Checked) AndAlso _
                    (CheckBox2.Checked) AndAlso _
                    (CheckBox5.Checked) AndAlso _
                    (Not CheckBox3.Checked) AndAlso _
                    (Not CheckBox4.Checked)) Then

                    Exit Do

                End If

            Loop

            ' Comprobamos que se ha abandonado el bucle
            '
            MessageBox.Show("Bucle finalizado...")

        End Sub

    End Class

    Ejecuta la tecla de función F5 para ejecutar el formulario, y haz clic en el control Button para iniciar el bucle. Éste se estará ejecutando hasta que los únicos controles CheckBox que se encuentren marcados sean los siguientes: CheckBox1, CheckBox2 y CheckBox5. Si los controles CheckBox3 y CheckBox4 están también marcados, no se abandonará el bucle.

    La cuestión está en establecer dentro del bucle las condiciones que deseas que tengan los distintos controles CheckBox para que puedas abandonar el bucle.

    Ya que observo que estás trabajando con temas de puertos, te repito que mientras no ejecutes el bucle en un SUBPROCESO DIFERENTE DEL SUBPROCESO PRINCIPAL, no vas a conseguir nada. ¿Está claro?

    Pues cuando tengas el ejemplo claro, lo aplicas a tu proyecto actual de Visual Basic. :-)

    Pero desde luego, también te digo que si tu intención es establecer ciertos valores de las propiedades de los controles, desde el mismo bucle que se ejecuta en otro subproceso, tampoco vas a poder. En éste supuesto, tienes que aplicar las técnicas que te ha descrito el compañero 'lopezatienza'.

    Lo que yo te he explicado, es solamente PARA LEER LAS PROPIEDADES CHECKED de los distintos controles CheckBox, pero no para modificarlas desde otro subproceso, porque no está permitido.

    En definitiva, si deseas que el usuario de tu aplicación pueda marcar los controles CheckBox mientras se está ejecutando el bucle, éste tienes que ejecutarlo en otro subproceso diferente. Pero si no es así, entonces no hace falta que ejecutes el bucle en otro subproceso, porque tan sólo necesitarás verificar los valores de las propiedades Checked de los distintos controles para poder abandonar el bucle cuando se presente la condición impuesta.

     


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.


    Thursday, December 08, 2011 12:06 PM
  • hola Enrique

    perdona por mi ignorancia pero es la primera vez que hago algo asi, y no lo podria llevar a cabo sin la inestimable ayuda que pesonas como tu me estais echando .

    se que de la forma que lo estoy haciendo es imposible . por eso deje el primer codigo que hice para empezar desde cero .

    tomando tu codigo como ejemplo funciona todo a excepcion , que no veo los datos en llos richtexbox , si pongo las sentecias de estos en el bucle  se ven los datos a medias y al cortar el bucle me dice, que no pueden leerse en un subproceso , que tienen que estar el el proceso primario .

    y si los pongo en el primario del boton, no se ve nada y  me dice  que utilice la palabra clave new para crear una instancia de objeto

    este ultimo es el que pongo aqui

     Private Sub BtParametrosDelphi1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckAnguloGiro.Click, CheckTension.Click, CheckSensor.Click, CheckEstadoMil.Click, BtParametrosDelphi1.Click
            Dim newthread As New Threading.Thread(AddressOf bucleParametros)
            newthread.Start()

            byteTension = ""
            byteAngulo = ""
            TxtTension.Clear()
            TxtAngulo.Clear()

            byteTension = leidos.Substring(16, 2) 'leer byte 16 en dos caracteres
            byteAngulo = leidos.Substring(12, 4)
            byteTension = Convert.ToInt32(byteTension, 16) ' convierte en decimal
            byteAngulo = Convert.ToInt32(byteAngulo, 16)

            If CheckAnguloGiro.Checked = True Then

                TxtAngulo.AppendText((byteAngulo) / 1000)
            End If



            If CheckTension.Checked = True Then

                TxtTension.AppendText((byteTension) * 0.0625 & "V") ' tensiion de UCE

            End If
        End Sub

        Private Sub bucleParametros()
            Dim n As Int32
            Do
                Port1.Write("220948" & vbCrLf)
                leidos = Port1.ReadTo(">")
               


                n += 1

                If ((Not CheckAnguloGiro.Checked) AndAlso _
                    (Not CheckEsfuerzo.Checked) AndAlso _
                    (Not CheckEstadoMil.Checked) AndAlso _
                    (Not CheckSensor.Checked) AndAlso _
                    (Not CheckTension.Checked)) Then
                    Exit Do

                End If


            Loop

        End Sub

     

    gracias


    se me obvido mencionar , soy estudiante , por eso se muy poco sobre vb

     

    • Edited by zocopeo Thursday, December 08, 2011 4:44 PM
    Thursday, December 08, 2011 4:24 PM
  • "zocopeo" escribió:

    > tomando tu codigo como ejemplo funciona todo a excepcion , que no
    > veo los datos en llos richtexbox , si pongo las sentecias de estos
    > en el bucle  se ven los datos a medias y al cortar el bucle me dice,
    > que no pueden leerse en un subproceso , que tienen que estar en el
    > proceso primario .
    >
    > y si los pongo en el primario del boton, no se ve nada y  me dice
    > que utilice la palabra clave new para crear una instancia de objeto

    Ya te he comentado anteriormente que, si tu intención es escribir texto en un control RickTextBox, o modificar la propiedad Checked de un control CheckBox, DESDE DENTRO DEL BUCLE QUE SE HA INICIADO EN OTRO SUBPROCESO, NO ESTÁ PERMITIDO, de ahí que estés teniendo los problemas que estás teniendo. Si es esto lo que deseas hacer, tienes que seguir los consejos de 'lopezatienza'.

    Pero si aparte de lo anterior, también deseas que el usuario pueda modificar los CheckBox mientras se está ejecutando el bucle, no te va a quedar más remedio que ejecutar el bucle en un subproceso independiente.

    Todo ésto lo tenías que haber indicado desde un primer momento, porque en tu primer mensaje hablabas solamente de detener un bucle LEYENDO solamente (no ESCRIBIENDO, que es muy distinto), el valor de la propiedad Checked del control CheckBox, de ahí que te comentara el iniciar un subproceso solamente para la ejecución del bucle.

    Tienes que tener en cuenta que desde un subproceso no se puede acceder a la interfaz de usuario de un control que se ha creado y se encuentra ejecutándose en otro subproceso; podrás leer los valores de sus propiedades, pero no podrás modificarlos.

    Insisto, revisa los enlaces que te indicó 'lopezatienza' en una respuesta suya para ver si puedes solucionar el problema: utilizar el método Invoke para ejecutar un Delegado, o bien, hacer uso del control BackGroundWorker, siempre y cuando estés utilizando la versión 2.0 o superior de .NET (Visual Basic 2005 o superior).

    > se me obvido mencionar , soy estudiante ,
    > por eso se muy poco sobre vb

    Me incomoda tener que decírtelo, pero el tema de los subprocesos es para estudiar bastante, porque si no lo tienes claro, difícilmente vas a poder controlar la salida de ese bucle.

    Ahora bien, si el usuario NO TIENE QUE "marcar" los controles CheckBox mientras se está ejecutando el bucle, entonces no tienes por qué utilizar otro subproceso independiente.

    Sería responder a la siguiente pregunta: ¿tiene el usuario que marcar/desmarcar controles CheckBox en el formulario?

      - Sí   --> Ejecutar el bucle en un nuevo subproceso,
                 porque mientras se esté ejecutando el bucle,
                 no va a poder marcar/desmarcar hasta que
                 se abandone el bucle.

      - No   --> No tienes que iniciar un nuevo subproceso;
                 solamente averiguar la manera de abandonar
                 el bucle cuando se den las condiciones que
                 tu impongas para abandonarlo.

     


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    Thursday, December 08, 2011 7:24 PM
  • hola despues de vacaciones, sigo estudiando la forma de hacer esto y no soy capaz

    la respuesta al comentario antrior de enrique es, si el usuario tiene que elegir que chekbox estan activos y cuales no

    no se sialgien podria poner un ejemplo con BackgroundWorker y Delegates  como expone lopezatienza, u otro tipo de ejemplo para leer los parametros del serie y procesarlos e integrarlos en texbox ya procesados

    el codigo que pongo se que no funciona pero ,es para que vean lo que quiero hacer

     Private Sub BtParametrosDelphi1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckAnguloGiro.Click, CheckTension.Click, CheckSensor.Click, CheckEstadoMil.Click, BtParametrosDelphi1.Click
            Dim newthread As New Threading.Thread(AddressOf bucleParametros)
            newthread.Start()

            byteTension = ""
            byteAngulo = ""
            TxtTension.Clear()
            TxtAngulo.Clear()

            byteTension = leidos.Substring(16, 2) 'leer byte 16 en dos caracteres
            byteAngulo = leidos.Substring(12, 4)
            byteTension = Convert.ToInt32(byteTension, 16) ' convierte en decimal
            byteAngulo = Convert.ToInt32(byteAngulo, 16)

            If CheckAnguloGiro.Checked = True Then

                TxtAngulo.AppendText((byteAngulo) / 1000)
            End If



            If CheckTension.Checked = True Then

                TxtTension.AppendText((byteTension) * 0.0625 & "V") ' tensiion de UCE

            End If
        End Sub

        Private Sub bucleParametros()
            Dim n As Int32
            Do
                Port1.Write("220948" & vbCrLf)
                leidos = Port1.ReadTo(">")
               


                n += 1

                If ((Not CheckAnguloGiro.Checked) AndAlso _
                    (Not CheckEsfuerzo.Checked) AndAlso _
                    (Not CheckEstadoMil.Checked) AndAlso _
                    (Not CheckSensor.Checked) AndAlso _
                    (Not CheckTension.Checked)) Then
                    Exit Do

                End If


            Loop

        End Sub

     

    un saludo

     


    • Edited by zocopeo Sunday, January 15, 2012 5:33 PM
    Sunday, January 15, 2012 1:49 AM