none
RichTextBox - Log RRS feed

  • Pregunta

  • Hola como están buenos días.

    Estoy recorriendo un proceso de datos y quiero mostrar en un RichTextBox el estado, es decir usarlo como un log pero la pantalla se queda congelada no actualiza y cuando se libera, el scroll del RichTextBox se queda arriba el texto ingresado se va debajo no se puede leer el ultimo texto ingresado.

    Este es un ejemplo de como escribo en el control, pero en diferentes partes del proceso.

    Me.KryptonRichTextBox1.Text = "Iniciando el proceso..." & vbNewLine
    Application.DoEvents()
    Me.KryptonRichTextBox1.Text = Me.KryptonRichTextBox1.Text & "Archivo encontrado y desempaquetando... "  & vbNewLine
    Application.DoEvents()
    Me.KryptonRichTextBox1.Text = Me.KryptonRichTextBox1.Text & "Observación: OK-Recuperado" & vbNewLine
    Application.DoEvents()
    Me.KryptonRichTextBox1.Text = Me.KryptonRichTextBox1.Text & "Termino la lectura"
    Application.DoEvents()
    
    

    Algún código de ayuda por favor.

    Gracias,


    Conocuica

    jueves, 10 de enero de 2019 10:33

Respuestas

  • Se puede hacer de muchas maneras y tiene muchas opciones. Por ejemplo, una forma básica de crear un hilo es así:

    Imports System.Threading
    
    '...
    
    Dim t as New Thread(AddressOf MiRutina)
    t.Start()
    
    '...
    
    Private Sub MiRutina()
        'Poner aquí el cálculo "largo".
        'Asegurarse de que no escriba nada en pantalla.
    End Sub

    • Marcado como respuesta conocuica jueves, 10 de enero de 2019 21:06
    jueves, 10 de enero de 2019 20:09

Todas las respuestas

  • Para conseguir que el richtextbox "baje" hasta el final y se vea lo último que le concatenaste, puedes usar estas dos líneas de código:

    Me.KryptonRichTextbox1.SelectionStart = Me.KryptonRichTextbox1.Text.Length
    Me.KryptonRichTextbox1.ScrollToCaret()

    Sin embargo, lo de que "se queda congelado" es más complicado de resolver. Aunque haces un "Application.DoEvents" cada vez que le concatenas algo, eso solo "descongela" el control durante un brevísimo instante en el momento en que la ejecución pasa por ahí. Si depués el programa sigue ejecutándose por otro sitio y se mete a hacer operaciones sin liberar el proceso en ningún momento (mediante más ejecuciones de Application.DoEvents), pues entonces durante todo ese tiempo se mantiene el bloqueo (no solo del richtextbox, sino de toda la pantalla).

    El remedio es usar programación en multihio, moviendo a un hilo distinto todas esas operaciones que mantienen al programa "ocupado". Pero esto no es sencillo de hacer, para programar en multihilo hay que saber muy bien qué es lo que estás haciendo porque tiene muchas restricciones y requisitos (por ejemplo, desde el hilo secundario no puedes acceder a ninguno de los controles que hay en pantalla).


    jueves, 10 de enero de 2019 15:23
  • Hola Alberto gracias por el dato pero tendras algun ejemplo de Multihilos gracias,

    Conocuica

    jueves, 10 de enero de 2019 20:02
  • Se puede hacer de muchas maneras y tiene muchas opciones. Por ejemplo, una forma básica de crear un hilo es así:

    Imports System.Threading
    
    '...
    
    Dim t as New Thread(AddressOf MiRutina)
    t.Start()
    
    '...
    
    Private Sub MiRutina()
        'Poner aquí el cálculo "largo".
        'Asegurarse de que no escriba nada en pantalla.
    End Sub

    • Marcado como respuesta conocuica jueves, 10 de enero de 2019 21:06
    jueves, 10 de enero de 2019 20:09