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!
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


0