2012-06-22 16 views
5

Tengo un programa escrito en VB6 que lee un archivo de texto largo y realiza una operación muy larga. También implementé la barra de progreso, pero mi problema es que, después de eso, mi programa dice "No responde" y comienza a responder de nuevo cuando se completa la tarea.La aplicación VB6 deja de responder

¿Cómo elimino este problema de "No responde"?

+1

Bienvenido a StackOverflow. Es posible que desee leer las preguntas frecuentes y las páginas relacionadas sobre [etiqueta] (http://stackoverflow.com/faq#etiquette), y trate de no gritar o usar texto en negrita innecesariamente. – Deanna

+1

Puede que le interesen las preguntas relacionadas [cancelar un proceso de larga ejecución en Vb6] (http://stackoverflow.com/questions/155517/cancelling-a-long-running-process-in-vb6-0-without- doevents) y [usando hilos en VB6] (http://stackoverflow.com/questions/383162/to-use-thread-in-programming-in-vb6) y [haciendo un evento kill para una aplicación Vb6] (http: //stackoverflow.com/questions/727386/making-ac-sharp-kill-event-for-a-vb6-app). Los títulos pueden no parecer relacionados, pero las respuestas te serán útiles. Explican algunas formas diferentes en que puede procesar el fondo en VB6 – MarkJ

Respuesta

7

Windows/Explorer cambiará un proceso al estado "No responde" cuando va demasiado tiempo sin procesar ningún mensaje. En VB6, esto sucederá cuando se ejecuta una sección larga de código sin llamar al DoEvents.

Desafortunadamente, VB6 no hace varios hilos fácilmente, por lo que su mejor opción es llamar periódicamente al DoEvents durante la operación. Idealmente, esto sería justo después de actualizar la posición de la barra de progreso.

Al hacer esto, deberá tener cuidado para proteger contra la reentrada. Esto es bastante fácil deshabilitando los controles cuando se inicia la operación larga y volviéndolos a habilitar cuando haya terminado. Si desea dejar que se cancelen, deberá usar un valor booleano que haya configurado en el evento de clic de botón cancelar y marque después de llamando al DoEvents.

+0

+1 Como se discutió [aquí] (http://stackoverflow.com/questions/155517/cancelling-a-long-running-process-in-vb6-0- sin-doevents) – MarkJ

1

Puede llamar al DoEvents en su operación larga, pero tenga cuidado ya que tiene asociado various caveats.

Cuestiones relacionadas