Foros del Web » Programación para mayores de 30 ;) » .NET »

Correr un ProgressBar o Label en segundo plano en Vb.net

Estas en el tema de Correr un ProgressBar o Label en segundo plano en Vb.net en el foro de .NET en Foros del Web. Buenos días, actualmente tengo un codigo que comprime todos los archivos .txt de una carpeta y/o subcarpetas. (Utilizo Vb.net 2005) Lo que quiero es correr ...
  #1 (permalink)  
Antiguo 25/06/2013, 08:26
 
Fecha de Ingreso: enero-2013
Mensajes: 93
Antigüedad: 11 años, 9 meses
Puntos: 0
Pregunta Correr un ProgressBar o Label en segundo plano en Vb.net

Buenos días, actualmente tengo un codigo que comprime todos los archivos .txt de una carpeta y/o subcarpetas. (Utilizo Vb.net 2005)
Lo que quiero es correr un ProgressBar en segundo plano o un Label mostrando el "porcentaje" mientras termina de comprimir los archivos para evitar que parezca como si se hubiese freezeado o paralizado la aplicacion, anexo el codigo!

Código vb:
Ver original
  1. Imports System.IO
  2. Imports System.IO.DirectoryInfo
  3. Imports System.IO.Directory
  4. Imports Ionic.Zip
  5. Imports System
  6.  
  7.  
  8. Public Class Form1
  9.     Private strPath As String
  10.     Dim txt As String, bol As Boolean
  11.     Dim a As String = ".zip"
  12.  
  13.  
  14.     Private Sub btnArchivo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnArchivo.Click
  15.         Try
  16.             With FolderBrowserDialog1
  17.                 .Reset()
  18.                 .Description = " Seleccionar una carpeta "
  19.                 .SelectedPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
  20.                 .ShowNewFolderButton = False
  21.                 Dim ret As DialogResult = .ShowDialog
  22.                 If ret = Windows.Forms.DialogResult.OK Then
  23.                     'Dim nFiles As ObjectModel.ReadOnlyCollection(Of String)
  24.                    'nFiles = My.Computer.FileSystem.GetFiles(.SelectedPath, FileIO.SearchOption.SearchAllSubDirectories)
  25.                    TextBox1.Text = FolderBrowserDialog1.SelectedPath.ToString()
  26.                  
  27.                 End If
  28.                 .Dispose()
  29.             End With
  30.  
  31.         Catch oe As Exception
  32.             MsgBox(oe.Message, MsgBoxStyle.Critical)
  33.         End Try
  34.     End Sub
  35.  Public Sub Comprimirtxt()
  36.         Dim txtFiles = Directory.GetFiles(Me.TextBox1.Text, "*.txt", SearchOption.AllDirectories)
  37.         For Each currentFile As String In txtFiles
  38.             Using zip As ZipFile = New ZipFile()
  39.                 zip.AddFile(currentFile, "")
  40.                 zip.Save(System.IO.Path.Combine(System.IO.Path.GetDirectoryName(currentFile), System.IO.Path.GetFileNameWithoutExtension(currentFile) + ".zip"))
  41.                 File.Delete(currentFile)
  42.  
  43.             End Using
  44.         Next
  45.     End Sub
  46. Private Sub btnComprimir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnComprimir.Click
  47.         BackgroundWorker1.RunWorkerAsync()
  48.         If TextBox1.Text = "" Then
  49.             MessageBox.Show("Seleccione una carpeta a comprimir")
  50.         Else
  51.            
  52.                     Comprimirtxt()
  53.                     MessageBox.Show("Accion Finalizada!", "Accion exitosa", MessageBoxButtons.OK)
  54. End Class

Ese es mi codigo y ya llevo atorado como 5 dias URGE :/ Saludos!
  #2 (permalink)  
Antiguo 25/06/2013, 14:24
 
Fecha de Ingreso: enero-2011
Mensajes: 6
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: Correr un ProgressBar o Label en segundo plano en Vb.net

davidalonsso05:
pregunto, ¿por qué tenés que hacer correr el progress bar en segundo plano?
Bastaría simplemente con hacer trabajar el progress bar normalmente, teniendo la precaución de incorporar un contador que en función de la relación entre la cantidad de archivos que se van comprimiento versus la cantidad total de archivos a comprimir, te vaya dando el porcentaje del trabajo realizado que debe ser llevado al progress.value, haciendo el valor máximo del progressbar = 100 y el mínimo igual a 0.
  #3 (permalink)  
Antiguo 25/06/2013, 15:25
 
Fecha de Ingreso: enero-2013
Mensajes: 93
Antigüedad: 11 años, 9 meses
Puntos: 0
Respuesta: Correr un ProgressBar o Label en segundo plano en Vb.net

Algo asi quiero hacer sin embargo NO se como "concatenar" "relacionar" ambas cosas, los archivos que se van a comprimir con el progreso de la barra...
Y si son demasiados archivos los que va a comprimir, no se queda paralizado el programa y la barra tambien o la barra sigue aumentando o corriendo?

Gracias y estoy al pendiente de cualquier respuesta, saludos!
  #4 (permalink)  
Antiguo 26/06/2013, 03:55
 
Fecha de Ingreso: enero-2011
Mensajes: 6
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: Correr un ProgressBar o Label en segundo plano en Vb.net

Nuevamente pregunto:
¿puedes determinar la cantidad de archivos a comprimir en la carpeta seleccionada?
Al aplicar el procedimiento: ¿puedes contar la cantidad de archivos que ya han sido comprimidos?
Si ambas cosas puedes hacerlas, tienes resuelto el value del progressbar.
Saludos
  #5 (permalink)  
Antiguo 26/06/2013, 07:24
 
Fecha de Ingreso: enero-2013
Mensajes: 93
Antigüedad: 11 años, 9 meses
Puntos: 0
Respuesta: Correr un ProgressBar o Label en segundo plano en Vb.net

No, no se pueden determinar la cantidad de archivos ya que si son 2000 archivos a comprimir al momento de contarlos haria lento el programa y la verdad no se como hacer eso, de igual manera sigo buscando, gracias, hasta luego.
  #6 (permalink)  
Antiguo 26/06/2013, 07:52
Avatar de angel1993  
Fecha de Ingreso: octubre-2009
Mensajes: 752
Antigüedad: 15 años, 1 mes
Puntos: 22
Respuesta: Correr un ProgressBar o Label en segundo plano en Vb.net

Si el problema es que el programa se queda parado, es totalmente normal ya que trabaja en el mismo Thread que el Form, lo que tienes que hacer es o bien ejecutarlo en otro thread o usar un backgroundworker (que es otro thread pero "administrado" por decirlo de alguna manera), échale un ojo a los Threads y a el backgroundworker y escoge la opción que más te guste, para sacar el % tienes que contar todos los archivos, sean 2.000 o 10.00.000 de archivos porque si no sabes cuantos archivos hay no sabes cuanto % se ha completado, así que te toca contarlos :(
__________________
@angelxab Twiiter
  #7 (permalink)  
Antiguo 26/06/2013, 08:04
 
Fecha de Ingreso: enero-2013
Mensajes: 93
Antigüedad: 11 años, 9 meses
Puntos: 0
Respuesta: Correr un ProgressBar o Label en segundo plano en Vb.net

Exacto! Es lo que quiero, usar el BackGroundWorker a eso me referia con segundo plano y en estas lineas de codigo obtenia el total de archivos de la ruta seleccionada:
Código vb:
Ver original
  1. 'Dim nFiles As ObjectModel.ReadOnlyCollection(Of String)
  2.                    'nFiles = My.Computer.FileSystem.GetFiles(.SelectedPath, FileIO.SearchOption.SearchAllSubDirectories)

PERO por decir, el usuario seleccionaba una ruta y esta, tenia muchos archivos se tardaba en contarlos y se paralizaba, luego, en la aplicacion le doy opcion de comprimir solo la carpeta seleccionada o tambien los archivos en la subcarpeta y si el usuario seleccionaba solo la carpeta de igual manera me cuenta TODOS los archivos, en carpetas y subcarpetas de la ruta seleccionada...
Es por eso que quiero el ProgressBar en SEGUNDO PLANO por si se paraliza comprimiendo o contando que siga corriendo la barra...
  #8 (permalink)  
Antiguo 26/06/2013, 08:25
 
Fecha de Ingreso: enero-2013
Mensajes: 93
Antigüedad: 11 años, 9 meses
Puntos: 0
Respuesta: Correr un ProgressBar o Label en segundo plano en Vb.net

Cita:
Iniciado por angel1993 Ver Mensaje
Si el problema es que el programa se queda parado, es totalmente normal ya que trabaja en el mismo Thread que el Form, lo que tienes que hacer es o bien ejecutarlo en otro thread o usar un backgroundworker (que es otro thread pero "administrado" por decirlo de alguna manera), échale un ojo a los Threads y a el backgroundworker y escoge la opción que más te guste, para sacar el % tienes que contar todos los archivos, sean 2.000 o 10.00.000 de archivos porque si no sabes cuantos archivos hay no sabes cuanto % se ha completado, así que te toca contarlos :(
Ya pude contarlos! hehe ya pude contarlos por extension y por carpeta y/o subcarpetas, solo me falta que la barra de progreso vaya aumentando de acuerdo a los archivos comprimidos :(
  #9 (permalink)  
Antiguo 26/06/2013, 11:15
Avatar de angel1993  
Fecha de Ingreso: octubre-2009
Mensajes: 752
Antigüedad: 15 años, 1 mes
Puntos: 22
Respuesta: Correr un ProgressBar o Label en segundo plano en Vb.net

¿No puedes Acceder desde otro thread al control?
mira esto http://www.elguille.info/NET/vs2005/..._otro_hilo.htm
__________________
@angelxab Twiiter
  #10 (permalink)  
Antiguo 26/06/2013, 16:18
 
Fecha de Ingreso: enero-2011
Mensajes: 6
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: Correr un ProgressBar o Label en segundo plano en Vb.net

Este artículo está también interesante

http://www.ajpdsoft.com/modules.php?name=News&file=article&sid=528
  #11 (permalink)  
Antiguo 27/06/2013, 07:55
 
Fecha de Ingreso: enero-2013
Mensajes: 93
Antigüedad: 11 años, 9 meses
Puntos: 0
Respuesta: Correr un ProgressBar o Label en segundo plano en Vb.net

La verdad que cada vez se me complica mas yo solo queria mostrar un progressbar en segundo plano que concordara con mi aplicacion y respecto a los enlaces los estoy analizando y si llego a obtener la solucion les aviso!

Saludos, buen dia!
  #12 (permalink)  
Antiguo 02/07/2013, 07:52
 
Fecha de Ingreso: enero-2013
Mensajes: 93
Antigüedad: 11 años, 9 meses
Puntos: 0
Respuesta: Correr un ProgressBar o Label en segundo plano en Vb.net

Buenos días, aun sigo con esta duda despues de 8 dias de trabajo
Intente con el siguiente codigo...
Código vb:
Ver original
  1. Public Sub Comprimirtxt1()
  2.         Dim nFiles As ObjectModel.ReadOnlyCollection(Of String)
  3.         nFiles = My.Computer.FileSystem.GetFiles(FolderBrowserDialog1.SelectedPath, FileIO.SearchOption.SearchTopLevelOnly, "*.txt")
  4.         i = CStr(nFiles.Count)
  5.         j = CInt(i)
  6. Dim txtFiles = Directory.GetFiles(Me.TextBox1.Text, "*.txt")
  7.         For Each currentFile As String In txtFiles
  8.             Using zip As ZipFile = New ZipFile()
  9.                 zip.AddFile(currentFile, "")
  10.                 zip.Save(System.IO.Path.Combine(System.IO.Path.GetDirectoryName(currentFile), System.IO.Path.GetFileNameWithoutExtension(currentFile) + ".zip"))
  11.                 File.Delete(currentFile)
  12.  End Using
  13.             'For x = 1 To j
  14.            'ProgressBar1.Minimum = 1
  15.            'ProgressBar1.Value = x
  16.            'ProgressBar1.Maximum = 100
  17.        Next
  18.         'Next
  19.    End Sub
Donde el usuario selecciona la ruta y la paso al textbox1, y logre contar los archivos ya sea por carpeta o subcarpetas pero sigo sin poder correr la barra en segundo plano...

Necesito ayuda ya que mañana es mi ultimo dia de trabajo y necesito entregarlo u.u

Saludos!
  #13 (permalink)  
Antiguo 02/07/2013, 12:09
Avatar de angel1993  
Fecha de Ingreso: octubre-2009
Mensajes: 752
Antigüedad: 15 años, 1 mes
Puntos: 22
Respuesta: Correr un ProgressBar o Label en segundo plano en Vb.net

Pon esto

Código vb:
Ver original
  1. CheckForIllegalCrossThreadCalls = False

en el formload y ya funcionaría, o debería.. jajaja
__________________
@angelxab Twiiter
  #14 (permalink)  
Antiguo 03/07/2013, 08:10
 
Fecha de Ingreso: enero-2013
Mensajes: 93
Antigüedad: 11 años, 9 meses
Puntos: 0
Respuesta: Correr un ProgressBar o Label en segundo plano en Vb.net

Ya casi casi jala la barra de progreso le puse la linea de codigo y lo unico que me da error es lo siguiente:

1.- Si son pocos archivos no corre totalmente la barra de progreso.
2.- Si son muchos archivos me dice:

Código vb:
Ver original
  1. Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
  2.         Dim nFiles As ObjectModel.ReadOnlyCollection(Of String)
  3.         nFiles = My.Computer.FileSystem.GetFiles(FolderBrowserDialog1.SelectedPath, FileIO.SearchOption.SearchTopLevelOnly, "*.txt")
  4.         i = CStr(nFiles.Count)
  5.         j = CInt(i)
  6.         Dim x As Integer
  7.         For x = 1 To j
  8.             ProgressBar1.Minimum = 1
  9.             ProgressBar1.Value = x + 1 <<<<< [B]El valor de '101' no es válido para 'Value'. 'Value' debería estar entre 'minimum' y 'maximum'.
  10. Nombre del parámetro: Value[/B]
  11.             ProgressBar1.Maximum = 100
  12.  
  13.         Next
  14.     End Sub

Saludos!
  #15 (permalink)  
Antiguo 04/07/2013, 13:05
Avatar de angel1993  
Fecha de Ingreso: octubre-2009
Mensajes: 752
Antigüedad: 15 años, 1 mes
Puntos: 22
Respuesta: Correr un ProgressBar o Label en segundo plano en Vb.net

¿Por qué asignas el máximum y el mínimum en el for?
Si Maximun es 100, no puedes poner 101 de value por que supera el máximo, una opción sería, poner el máximo como el total de archivos que vas a recorrer
Código vb:
Ver original
  1. ProgressBar1.Maximum =nFiles.Count

eso por una lado, por otro
¿Por qué?
Código vb:
Ver original
  1. i = CStr(nFiles.Count)
  2. j = CInt(i)

.Count es integer... lo estás convirtiendo en string para meterlo en i y luego otra vez en integer para meterlo en j, para eso haz directamente
Código vb:
Ver original
  1. j = nFiles.Count


De todas formas yo directamente lo haría así

Código vb:
Ver original
  1. Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
  2.          Dim nFiles As ObjectModel.ReadOnlyCollection(Of String)
  3.          nFiles = My.Computer.FileSystem.GetFiles(FolderBrowserDialog1.SelectedPath, FileIO.SearchOption.SearchTopLevelOnly, "*.txt")
  4.        
  5.          ProgressBar1.Maximum = nFiles.Count
  6.          ProgressBar1.Minimum = 1
  7.  
  8.          For x = 0 To nFiles.Count - 1
  9.             ProgressBar1.Value = x + 1
  10.          Next
  11.     End Sub

Fíjate que le resto 1 al .Count cuando hago el for, ya que las colecciones empiezan desde 0, así que el for empieza desde 0 hasta el total - 1
empezabas el for desde 1, si el primer elemento es 0, el primer elemento lo ignoras :/
__________________
@angelxab Twiiter

Última edición por angel1993; 04/07/2013 a las 13:15

Etiquetas: aplicacion, bd, correr, label, net, plano, progressbar, segundo, textbox, vb
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:52.