Visual Basic - Proceso en segundo plano

Life is soft - evento anual de software empresarial
 
Vista:

Proceso en segundo plano

Publicado por llermo (28 intervenciones) el 20/04/2006 19:01:03
Un saludo a todos

Os comento.

Después de mucho sufrimiento, he conseguido hacer un reloj de arena. El problema radica en la forma de pintado.

Tengo un for que se ejecuta constantemente mientras queden granos de arena que caer. ¿Qué pasa? pues que hasta que no termina de "gastarse" todo el tiempo del reloj, la aplicación se queda bloqueada.

¿Conocéis alguna manera de optimizar esto? ¿Se puede lanzar esta tarea en segundo plano? de esta manera se seguiría "gastando" el tiempo y se podría seguir trabajando con el resto de la aplicación... pero no sé como se puede hacer, si es que se puede hacer...

¿Alguna idea?

A continuación os pongo el código que utilizo para realizar el volcado de la arena:

'Este procedimiento se encarga de restar un pixel al reloj de arena y situarlo en la parte inferior del mismo
Public Sub restaTiempoRelojArena()
Dim x As Long, y As Long, h As Long

With picRelojArena
h = .hdc

For y = 0 To (.ScaleHeight - 1) / 2
DoEvents
For x = 0 To .ScaleWidth
DoEvents
'Si el pixel corresponde a un grano de arena
If GetPixel(h, x, y) = RGB(getColorPintadoRelojArenaRed, getColorPintadoRelojArenaGreen, getColorPintadoRelojArenaBlue) Then

'Eliminamos el pixel de la parte superior
SetPixel h, x, y, RGB(getColorFondoRelojArenaRed, getColorFondoRelojArenaGreen, getColorFondoRelojArenaBlue)
'Lo pintamos en la parte inferior
SetPixel h, x, .ScaleHeight - y - 1, RGB(getColorPintadoRelojArenaRed, getColorPintadoRelojArenaGreen, getColorPintadoRelojArenaBlue)

'Esperamos el tiempo necesario para que nos de tiempo a pintar todo el reloj
Sleep Round((picRelojArena.Tag / intNumeroCuadrosPorPintar), 5) * 500

'Nos queda 1 pixel menos que pintar
intNumeroCuadrosPorPintar = intNumeroCuadrosPorPintar - 1
.Refresh

If intNumeroCuadrosPorPintar = 0 Then
Exit For
End If
End If
Next
If intNumeroCuadrosPorPintar = 0 Then
Exit For
End If
Next
End With

End Sub

Muchas gracias!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Proceso en segundo plano

Publicado por Alex (119 intervenciones) el 20/04/2006 20:16:58
Ya intentaste que los ciclos que tienes empiezen desde el principio? es decir, como si apenas se hubiese cargado el form...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Proceso en segundo plano

Publicado por marcos (18 intervenciones) el 20/04/2006 21:46:25
Pon DoEvents dentro de un for y checalo...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Proceso en segundo plano

Publicado por marcos (18 intervenciones) el 20/04/2006 21:47:44
ya probaste con un timer...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Proceso en segundo plano

Publicado por marcos (18 intervenciones) el 20/04/2006 21:48:54
ya probaste con tu reloj como OCX?...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Proceso en segundo plano

Publicado por Alex (119 intervenciones) el 21/04/2006 02:51:18
Que no se supone que ya lo tenia que haber tenid en un timer???

O_o
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Proceso en segundo plano

Publicado por llermo (28 intervenciones) el 21/04/2006 11:40:34
Bueno primero daros las gracias por vuestra atención

Y comentaros que,

-nada más cargar el form no me vale, ya que el reloj de arena se pone en marcha cuando ocurren una serie de acciones.
-con el doevents tengo el problema que cuando el usuario hace click en el menu archivo (o cualquier otro) el reloj se detiene hasta que el codigo del menú pinchado no se completa.
-con el timer ocurre que cuando se quiere contar un tiempo pequeño (10 ó 15 segundos por ejemplo) el intervalo debe ser tan pequeño (2 ó 3) que cuando se acaba de inicar el evento ya se debería de estar ejecutando otra vez.
-como ocx hace exactamente lo mismo que lo ya explicado. hasta que no termina de ejecutarse el for, no se devuelve el control.

Así está la cosa. ¿Alguna idea más?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Proceso en segundo plano

Publicado por Alex (119 intervenciones) el 21/04/2006 16:59:25
Tengo otra idea, puedes hacerlo con el doevents de esta forma:

Buscas un codigo, que yo encontre en la pagina de elguille.info, este codigo, debe de ser para poder poner en un picturebox, una forma... Como una MDI, pero esta codigo solo insertara la otra forma en la principal.

Asi podras cargar la forma del reloj indefinidamente sin que estes dando click en algun otro objeto, ya que tu estaras dando click en la forma principal, no en la del reloj...

Esa es la unica idea que tengo hasta el momento, si la intentas espero que te sirva y nos lo comuniques, hasta luego y suerte...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Proceso en segundo plano

Publicado por marcos (4 intervenciones) el 24/04/2006 14:44:11
diran que como chigo, pero... ya probaste DoEvents y OCX?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar