2010-10-18 10 views

Respuesta

16

Un truco feo es usar Application.DoEvents. Mientras esto funcione, recomendaría no hacerlo.

Una mejor solución es utilizar un BackgroundWorker o un hilo separado para realizar tareas de larga ejecución. No use el hilo de la GUI porque esto hará que se bloquee.

Una cosa importante a tener en cuenta es que los cambios en la GUI deben realizarse en el hilo de la GUI, por lo que debe transferir el control nuevamente al hilo de la GUI para las actualizaciones de las etiquetas. Esto se hace usando Invoke. Si usa un BackgroundWorker, puede usar ReportProgress; esto manejará automáticamente invocar a Invoke por usted.

+3

Detalles sobre [clase de trabajador de fondo] (http: // bit.ly/a9VgVn) y un [ejemplo de cómo usarlo] (http://bit.ly/ailRTF) – codingbadger

0

Actualmente, todo su procesamiento se realiza en la hebra principal (IU), por lo que todo el proceso debe completarse antes de que la hebra de UI tenga ciclos libres para volver a pintar la IU.

Tiene 2 formas de superar esto. La primera forma, que no se recomienda, es usar
Application.DoEvents(); Ejecute esto siempre que desee que se procese la cola de mensajes de Windows.

La otra forma recomendada: cree otra secuencia para hacer el procesamiento y use un delegado para volver a pasar las actualizaciones de la interfaz de usuario a la secuencia de la interfaz de usuario. Si es nuevo en el desarrollo multiproceso, pruebe con BackgroundWorker.

2

La interfaz de usuario se actualiza cuando aparece el mensaje WM_PAINT para volver a pintar la pantalla. Si está ejecutando su código, la rutina de manejo de mensajes no se ejecuta.

para que pueda hacer lo siguiente para habilitar la ejecución del controlador de mensajes:

El Application.DoEvents, llama al controlador de mensajes, y luego vuelve. No es ideal para trabajos grandes, pero para procedimientos pequeños, puede ser una solución mucho más simple, en lugar de introducir subprocesos.

0

GUI no se puede actualizar mientras se ejecuta el código de esa manera. La GUI en Windows depende del procesamiento de mensajes, y el procesamiento de mensajes se detiene mientras está en su código; sin importar lo que haga con las etiquetas, botones y demás, todos serán actualizados DESPUÉS de que salga su código y el bucle de mensaje principal del formulario procesada.

Usted tiene varias opciones aquí: procesamiento

  • traslado a otro hilo y se enfrentan a Invoke() situtations
  • DoEvents de llamada() y permitir GUI para refrescar entre su DoWork llama
  • hacer todo el trabajo y actualizar más tarde
Cuestiones relacionadas