Visual Basic - Calcular tiempo

Life is soft - evento anual de software empresarial
 
Vista:

Calcular tiempo

Publicado por Krator (71 intervenciones) el 27/09/2005 19:05:25
Bueno, estoy realizando una pequeña aplicación que busca en el disco duro los archivos que le indiques. Bien, esta parte está realizada de forma correcta. Pero como es un proceso largo, quise poner una barra de progreso. Bien, sé que para hacer la barra necesito ir cambiando el value de su propiedad, pero tiene un problema, ¿Cómo sé cuanto habría de darle cada pasada?

Es decir, el HD puede variar de 40, 60,200Gbs... y para cada uno tardará cierta cantidad de tiempo...
Pensé en un objeto timer...pero ni idea de como calcular el tiempo que va a llevar el proceso.

Bueno, creo que ya me entendieron lo que quiero hacer. Gracias por anticipado.
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

Insisto

Publicado por Krator (71 intervenciones) el 29/09/2005 13:30:44
Pues eso, insisto en la manera de calcular el tiempo :)
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:Consejo

Publicado por Zoto (4 intervenciones) el 29/09/2005 19:56:34
Hola Krator.

He leído tu mensaje y, respecto a lo que dices, creo que en un principio no es posible hacerlo.

Para marcar el progreso de una operación con un ProgressBar, por ejemplo, (indicando el porcentaje o fracción del proceso que se ha llevado a cabo hasta el momento) es necesario disponer el valor total.
Es decir, en tu caso, el usuario introduce una cadena de texto y el programa checkea los nombres de los archivos del disco duro en busca de coincidencias en el nombre, si no he entendido mal. Bien, pues lo que necesitarías conocer para marcar la fracción de progreso llevado a cabo sería el número total de archivos que coinciden con la cadena de texto dada, resultado que no vas a conocer hasta que el programa los haya listado todos, es decir, cuando haya finalizado la operación.

Este, en principio, es un caso en el que no vas a poder marcar el progreso, puesto que necesitas el valor total de archivos y este es imposible de encontrar sin haber analizado todos previamente.

Lo que si que podrías hacer es permitir al usuario la opción de seleccionar el número de archivos máximo que desea listar de modo que, cuando los archivos encontrados igualen al número máximo, el programa cese de analizar archivos e finalice su operación. Solo en el caso de que el usuario escoja listar hasta un número determinado de archivos, sería posible mostrar el progreso de la operación con un ProgressBar.
Para mostrar el porcentaje tan solo deberías recurrir a una simple regla de tres, donde dar las variables X (que sería el número de archivo encontrado) y Total (el número total de archivos escogido por el usuario).

'*******************************************
'Ejemplo:

Dim Porcentaje As Byte 'Variable que contendrá el porcentaje de archivos encontrados

Dim X As Double 'Contiene el número de archivo encontrado

Dim Total As Double 'Contiene el número total de archivos

Porcentaje = Round(( X * 100 ) / Total) 'Regla de tres-> obtenemos el porcentaje

'*******************************************

Bueno, espero que mi consejo te haya ayudado en algo y te sirva para aclarar las cosas. Si necesitas ayuda, no dudes en postear.

Hasta la próxima.

Zoto
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:Consejo(no me entendiste)

Publicado por Krator (71 intervenciones) el 29/09/2005 23:50:19
Me temo que no me entendiste, lo que significa la barra, no es el número de archivos encontrados, sino la busqueda de todos los archivos. Es decir, examina toda la unidad C, en busca del archivo. Es decir, que recorre TODOS los archivos y finaliza, cuando ya no hay mas archivos en C (pero no con ese nombre, sino con cualquiera).

Es como la busqueda del windows...pero "amenizada" por una barra de progreso.
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:Captado

Publicado por Zoto (41 intervenciones) el 30/09/2005 16:29:55
De acuerdo Krator.

Ahora entiendo lo que deseas hacer.
Entonces, sí que es posible.

Lo que deberías hacer sería obtener el espacio total ocupado del disco duro y establecerlo como valor bytesTotal.
Hecho esto, en la función en la que recorres cada archivo del disco duro deberás añadir una variable llamada, por ejemplo, bytesRead, en la que irás sumando el tamaño en bytes de cada archivo del disco (de manera que a medida que vayas recorriendo archivos el valor irá aumentado hasta que llegue a igualar el valor de la variable bytesTotal, lo cual significará que la operación ha terminado).

Aquí te muestro un ejemplo de como debería ser el código más o menos.

'Cuestiones a tener en cuenta: -----------------------------------------
'La barra de progreso (ProgressBar) la voy a llamar PB.
'----------------------------------------------------------------------------------

'Variables necesarias.
'La bytesRead la he marcado como comentario por la cuestión que comento en la función GetFiles, abajo.

'Dim bytesRead As Double (si la función es recursiva)
Dim bytesTotal As Double

'Función principal que recorre los archivos del disco
'(me he inventado el nombre y solo he escrito el código que deberías añadir)

Function GetFiles()

'Se añade la variable bytesRead comentada arriba
'AVISO: estoy teniendo en cuenta que el procedimiento que usas para obtener los archivos NO ES RECURSIVO, ya que si lo fuese, la variable tendría siempre únicamente el valor del tamaño del archivo actual en bytes si estuviese declarada dentro (se haría una copia, cada vez).
Si la función que usas es recursiva, declara la variable bytesRead como global, tal y como he hecho con la bytesTotal.

Dim bytesRead As Double 'Ten en cuenta la recursividad...
Dim fileSize As Double 'Contiene el tamaño en bytes del archivo actual

'.........................
'CÓDIGO....
'.........................

fileSize = [TAMAÑO_DEL_ARCHIVO_ACTUAL]
bytesRead = bytesRead + fileSize

PB.Value = Round(( bytesRead * PB.Max) / bytesTotal) 'Regla de tres para obtener el procentaje (digo porcentaje porque se supone que la propiedad Max del PB está en 100. De todos modos, podrías también establecer la propiedad Max con el número total de espacio ocupado del disco (bytesTotal) y, de esta manera, evitarías tener que realizar la regla de tres.
'Yo normalmente la hago con la regla de tres para mostrar en una Label el porcentaje de los progresos, además de usar la ProgressBar, tomando así tan solo la propiedad Value de la misma y añadiéndole un carácter %).

End Function

'Esta es la función que devuelve el tamaño ocupado de un disco duro en bytes, para poder rellenar la variable bytesTotal.
'Toma como parámetros la letra de la unidad y devuelve un Double con el número de bytes ocupado.
'Si ocurre algún error el valor devuelto es cero.
'Contrariamente, devuelve el número de bytes ocupados en el disco duro.

Public Function GetHDUsedSpace(ByVal strUnit As String) As Double
On Error GoTo ERROR_OC
'Variables pasadas por referencia a la API
Dim SecPClu As Long 'Sectores Por Cluster
Dim BytesPSec As Long 'Bytes Por Sector
Dim NumFreeClu As Long 'Número de Clusters Vacíos
Dim TotalNumClu As Long 'Número total de clusters

'Variables que contendrán valores finales
Dim freeSpace As Double
Dim totalSpace As Double

GetDiskFreeSpace strUnit, SecPClu, BytesPSec, NumFreeClu, TotalNumClu

totalSpace = (SecPClu * (BytesPSec / 1024) * TotalNumClu)
freeSpace = (SecPClu * (BytesPSec / 1024) * NumFreeClu)
GetHDUsedSpace = (totalSpace - freeSpace) * 1024 'Se devuelve el espacio usado en bytes
ERROR_OC:
End Function

'Con este código, ahora tan solo deberías añadir lo siguiente, antes de llamar a la función que realiza el recorrido de los archivos del HD.

bytesTotal = GetHDUsedSpace(LETRA_UNIDAD)

es decir, asignar a la variable bytesTotal el valor devuelto de la función GetHDUsedSpace al darle como parámetro la letra de la unidad seguida de :\ (es decir, el tamaño ocupado del disco).

_________________________________________

Bueno, espero que todo esta explicación (espero que no haya sido demasiado pesada) te sirva de mucho. Ah! Y también espero haberte entendido... ;-)

Si tienes problemas con el código o no entiendes algo del mismo, no dudes en comentármelo.

Hasta pronto,

Zoto
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:Captado

Publicado por Krator (71 intervenciones) el 30/09/2005 16:58:12
Genial, sencillamente genial.
Te agradezco mucho que te hayas entretenido en ayudarme. En cuanto pueda me pondré manos a la obra. Un saludo y de nuevo GRACIAS.
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:De nada

Publicado por Zoto (4 intervenciones) el 30/09/2005 17:06:49
De nada Krator.

Para eso estamos...

Bueno, me alegro que te haya gustado mi explicación y, sobretodo, que la entiendas.

Si alguna otra vez te surge otra duda o problema, postea aquí tu mensaje para que podamos contestarte.

Hasta la próxima,

Zoto
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