refresh de formulario

Iniciado por g_cury, 2 Octubre 2018, 17:48 PM

0 Miembros y 1 Visitante están viendo este tema.

g_cury

Gente, tengo un programa viejo en VB6 que me hace una actualización de base de datos desde un archivo plano txt, la cosa que dicho proceso dura aproximadamente 15 o 20 minutos o mas y el usuario que usa esta aplicación como es impaciente a los minutos me aborta el programa creyendo que esta colgado por lo que me genera numerosos inconvenientes. La idea es generar un contador de lineas para que el usuario vea que el proceso esta corriendo y tenga idea de cuantas lineas falta para terminar el proceso, el problema me radica que le he puesto un contador en un timer e inclusive en el loop del copiado de lineas hacia la base de datos pero nunca logro que me refresque el formulario, a lo sumo me lo refresca los primeros 10 segundos y después como que cuelga y no refresca mas aunque el proceso sigue en segundo plano pero la interface de la aplicación aparece como colgada (con el mensaje de no responde). Alguna idea para ayudarme. (abstenerse los que como solución tengan migrar a .net). Uso sistemas operativos XP y 7. Gracias a los que me puedan ayudar

Serapis

Tienes que forzar un 'refresh'... pero mejor que dentro del bucle (que puede ralentizar aún más la operación y que puede depender de cuanto tarde en ejecutarse cada ciclo, es usar un timer.... ajustando su evento a 1 segundo (timProgreso.Interval = 1000)...
Cada minuto, al mismo tiempo actualizas el formulario completo, suele ponerse en blanco...

Código (vb) [Seleccionar]

Private Sub TimProgreso_Timer()
    Static segs As Byte
   
    ' Si usas un progressbar....
    progressbar.Value = X ' este será un valor relativo previamente calculado en el bucle
    progressbar1.Refresh 

    ' O si usas un simple label o textbox...
    labprogreso.Caption = "Registro: " & cstr(x)  & " de " & cstr(y)
    labprogreso.Refresh
    DoEvents
   
    segs = (segs + 1)
    If (segs = 60) Then  ' Cada minuto, refresca todo el formulario...
        segs = 0
        form1.Refresh
        DoEvents
    End If
End Sub


Nota que no afectamos al bucle, así puede ser llamado desde diferentes funciones que tengan tareas pesadas, en vez de meter código excesivo en cada función, simplemente antes del bucle ponemos el timer en marcha (ponemos a cero el valor de la barra de progreso, etc...), y al término lo desactivamos (y ocultamos el control encargado de mostrar el progreso), vamos que se necesita una función con un parámetro de activación y alguno opcional para señalar el valor máximo y mínimo al comienzo y tal vez el valor de avance) ... El contador del bucle debería ser accesible, es decir declarado a nivel de módilo, para que el timer lo tenga disponible.

En fin, no creo que haga falta señalar detalles específicos...

gundream

¿En serio tarda más de 20 minutos? ¿Y dices que el usuario es impaciente por cerrarlo?  :silbar:

Con todo el respeto, si tienes 20 minutos colgado un programa creo que deberías replantearte el código. Si quieres ponlo en el foro y le echamos un vistazo.