Vb no responde

Una consulta como puedo hacer para que un formulario no se quede colgado con el típico mensaje de vb no responde cuando tengo una consulta que demora largo rato
Respuesta
1
Mmm... no me ha ocurrido nunca... puede ser por varios motivos... ¿Qué estás haciendo consulta a la BD?... prueba a intercalar en el código "DoEvents".
Pero igual la solución pasar por ver la consulta por si se puede mejorar en tiempo.
¿Cuéntame lo que sea de acuerdo?...
Gracias Kik asies un formulario con un botón generar consulta le doy clic pero como es una consulta larga demora y si le doy click en alguna parte del form o fuera en el mdi se cuelga (y sale en la barra del form vb no responde) has ta que termina la consulta de ahí todo ok
, se que es cuestión de esperar a que la consulta termine pero se ve refeo para el usuario que se quede así colgado
Gracias
Podrías ver también poner una barra de progreso,... la barra de progreso la puedes ir rellenando con un control Timer... este control Timer al ejecutarse cada intervalo de tiempo que le especifiques siempre está activo... con lo cual puede que te solucione el tema del "No Responde"... se que me explique fatal... no obstante si te interesa esta solución házmelo saber y te paso una especie de proyecto con un Timer como funciona para que le eches un vistazo.

4 respuestas más de otros expertos

Respuesta
1
DIFÍCIL poder responder a esta consulta, sin el código fuente que provoca ese error (o cualquier error, en realidad).
Puede ser prácticamente CUALQUIER cosa, desde un bucle con una condición no resuelta, la espera de un evento por la respuesta de un dispositivo presente pero inactivo, y hasta una subrutina de control de error que en realidad capture el error, pero que por un equivocado enfoque del programador no exponga el correspondiente mensaje.
Algo que se me ocurre aún antes que me proveas tu código, es que:

1) Verifiques si puedes interrumpir la ejecución del mismo (dando por hecho que estás trabajando con el código fuente dentro del entorno de edición y programación, NO con el ejecutable) mediante la presión simultánea de las teclas <CTRL> + <Pausa>, y de esa manera verás donde el punto de ejecución se encontraba "congelado".
2) Si la interrupción anterior no fuera posible, pero de todos modos sabes donde es que se "bloquea", prueba de incluir (si es que el trozo de código en cuestión implica "For... Next" u otra sentencia de anidación similar) la sentencia DoEvents, así tal cual sin más, en medio del código, para que puedas efectuar la interrupción del punto 1.

3) EN REALIDAD, hasta creo que bastaría con que precisamente incluyas TAN SOLO dicha sentencia DoEvents en medio de esa "... consulta que dura largo rato..." ¿Por qué? Porque de esa manera estarás proveyendo un modo de comunicación con los demás procesos de la misma aplicación y hasta con el resto del sistema operativo, quienes al menos "se darán cuenta" que no hay un bloqueo o "congelamiento" del proceso, sino que en medio de su ejecución, cualquier evento podría tomar el mando cuando quisiera.
De todos modos ten cuidado con la inclusión de "DoEvents" dentro de cualquier parte de tu código sin considerar las probables consecuencias: La documentación de VB es bastante clara al respecto, porque en realidad podrías generar un conflicto con procesos posteriores que verdaderamente deberían esperar a que finalizara el anterior; eso solo TÚ lo sabes, pues conoces el resto de tu aplicación. No obstante, una buena codificación "desde los cimientos" debería anular la probabilidad de conflictos, y el agregado de "DoEvents" más bien podría ser extremadamente útil cualquier se corren varios procesos simultáneos (no solo los de VB) facilitando la multitarea o multihilos de las modernas versiones de Windows.
Si tienes dificultad en comprender o aplicar estos conceptos, como último recurso mándame el código fuente que estás utilizando, y con gusto lo analizaré por ti.
OK gracias aplicare el tema del doevents, otra duda tengo una consulta maestro detalle que la visualizo en datareport hasta ahí todo ok me muestra la cebecera del maestro y su detalle seguida de las siguientes cabeceras y sus detalles, pero en foxpro he visto que una cabecera si tiene 4 filas de detalle los muestra en una sola hoja y la siguiente cabecera si tiene no se 10 o 15 filas los muestra en otra hojas y así sucesivamente, teniendo esto una mejor presentación, dime esto como se haría en vb
De antemano Gracias por tu ayuda
Deduzco que el DataReport del que me hablas, evidentemente un wizard (asistente) de reportes impresos del FOXPRO, es el equivalente del CrystalReport del Visual Basic.
Bueno, debo confesarte que... ODIO los asistentes de reportes de impresión, y prefiero más bien arreglarme (y muy bien, porque se tiene TOTAL control de la impresión) con "Printer.print" que imprime en la impresora predeterminada del sistema.
Te conviene definir primero la fuente que imprimirás, la que tradicionalmente sería "Courier New", porque es una fuente proporcionada (las "i" ocupan el mismo espacio que las "o"), así...
Printer.Font.Name = "Courier New"
Printer.Font.Size = 10
Entonces, para imprimir cada línea, cuidarías de no sobrepasarte de la cantidad de columnas disponibles, porque el excedente simplemente se pierde FUERA del margen.
Para imprimir en las columnas que necesites, la sentencia sería...
Printer. Print Tab(5); "Variable o frase como ésta"
De hecho, el número del tabulado bien puede ser una variable.
Para dar formato (negrita, cursiva, subrayado, tamaño, etc.)...
Printer.Font.Bold = true
Printer.Font.StrikeThrough = True
Printer.Font.Italic = True
Printer.Font.Underline = True
Printer.Font.Size = 14
Printer.print tab(5); "Acá imprimís lo que necesites"
Printer.Font.Underline = false
Printer.Font.Italic = false
Printer.Font.Underline = false
Printer.Font.Bold = false
Printer.Font.Size = 10
Como verás, "encendés" (true), o "apagás" (false) el efecto deseado, porque en realidad esas líneas de efectos no imprimen nada, solo aplican el efecto para el texto a continuación.
Incluso podes elegir en qué impresora imprimirías, si es que tienes más de una. En realidad, este enfoque sirve también para "imprimir" al FAX, si lo tenés definido como una impresora, facilitándote enviar informes por este medio, aunque esté un poco fuera de uso en la actualidad.
Respuesta
1
Creala en un proceso asíncrono, hay varias técnicas pero las más simple es crearte una DLL en VB para las llamadas a la BD ( básicamente encapsulas ADO).
Con eso lo que logras es que la DLL se quede pillada, pero la pantalla de VB aparentemente No.
También puedes bloquear el formulario antes de lanzar la query, así evitas que lo trasteen y bloqueen la pila de llamadas, pero esto puede hacer cosas raras.
Si no sabes como hacer las DLL me locomentas.
Gracias Tigre, si la verdad la he intentado boqueando el formulario, pero cuando le doy click en el form o en el midi que lo contiene se vuelve a colgar (no responde) hasta que termina la consulta y de ahí todo normal, pero esto queda algo refeo para el usuario que espera el repporte. Lo de los dll si no se te agradecería si me puedes orientar en el uso de estos para hacer la consulta
Gracias
Atentamente
Miguel
Primero prueba con una llamada asíncrona directa, que me acabo de acordar que se puede, lo que pasa es que como lo monto siempre todo con DLLs terminan olvidándose las bases.
Dim Cmd As ADODB.Command
Dim rs As ADODB.Recordset
Set Cmd = New ADODB.Command
Cmd.ActiveConnection = cn
Cmd.CommandType = adCmdText
Cmd.CommandText = "SELECT * FROM Usuarios"
Abort = False
Set rs = Cmd.Execute( , , adAsyncExecute)
Do While CBool(Cmd.State And adStateExecuting)
    DoEvents
    If Abort Then
        Cmd.Cancel
    End If
Loop
A ver como te va.
Por cierto. Lo de `tigre' en España suena muy mal, aquí llamamos así al WC.
jajaj sorry, si Cervantes viviera¡
Oye y como hago para crear las dll de consultas en vb
Gracias
Añade a tu proyecto otro nuevo tipo 'Dll'
Crea una clase publica
Dale una referencia a ADO
Y deriva las llamadas conexión y Excecute a las de ADO ( los métodos no hacen nada, solo derivan la llamada y devuelven el dato, eso se llama subclasificar).
Luego a tu proyecto actual.
Le añades la referencia a la nueva DLL y ejecutas, fíjate además que la nueva DLL tenga como propiedad la ejecución asíncrona.
Con eso te debería ir funcionando.
Respuesta
1
Mmmmm no vas a poder hacer nada más que esperar, vb no te permite manejar la memoria...
Ok gracias si tienes razón tengo que esperar de todas formas hasta que se suelte la consulta, pero como hago para que no se muestra ese mensaje e la barra de mi formulario(vb no responde) eh visto que esto en foxpro se puede hacer
Gracias
No, no puedes modificarlo desde vb, ya que no te deja tocar nada a bajo nivel...
Respuesta

For f = 1 to 10

f = 1

next 

ya lo tienes colgado.

o un do while sin salida

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas