2012-09-16 29 views
6

Tengo un gran text file que contiene muchas líneas de datos. En mi aplicación, abro este archivo, leo cada línea haciendo coincidir una expresión regular y la visualizo en una vista de tabla de datos. El número total de filas generadas es de alrededor de 2000 (A veces incluso más, por lo que es bastante grande).Barra de progreso y carga de archivos

Por lo que para todas estas operaciones lleva bastante tiempo. Así que moví este código a otro hilo usando el trabajador de fondo y todo está bien, excepto que quiero mostrar el estado de carga en una barra de progreso donde estoy fallando.

He usado FileInfo clase para obtener la longitud del archivo y luego le dio este valor al Progressbar.Maximum. Parece que no es el enfoque correcto porque un archivo de prueba que contiene "3" líneas devolvió una longitud de archivo de "305". No entiendo cuánto intervalo de pasos debo dar de esta manera.

Ejemplo de código:

FileInfo ff = new FileInfo(openFileDialog1.FileName); 
int fsize= Convert.ToInt32(ff.Length); 
int val=1; 
pgbar_load.Invoke(new MethodInvoker(delegate { pgbar_load.Maximum = fsize; })); 

y en el bucle:

++val; 
wk.ReportProgress(val); 

y luego:

private void bgwrkr_load_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    pgbar_load.Value = e.ProgressPercentage; 
} 

Así que dos cosas que estoy buscando:

  1. Configurando el valor máximo para la barra de progreso.
  2. Configuración correcta del índice de pasos.

Por favor sugierame una manera de seguir adelante.

Respuesta

6

Mantenga Progressbar.Maximum en 100. A continuación, realice un seguimiento de sus datos de lectura en una variable int. Ejecute un ciclo en el hilo de la interfaz de usuario (puede usar el temporizador para hacer esto), que establece el valor del porcentaje de la barra de progreso al verificar sus bytes de lectura. P.ej. supongamos que almacena sus bytes de lectura en int totalRead; y int totalFileSize contiene el tamaño de su archivo.

myProgressBar.Value = Convert.ToInt32(Math.Ceil(100d * totalRead/totalFileSize)); 

Puede poner esto en su controlador de evento tick timer. Esto ejecutará la barra de progreso gradualmente al 100%. Cuando se completa la lectura del archivo, desactive el temporizador.

+0

¿Cómo puedo leer el total de bytes de lectura cada vez, me refiero al valor int totalRead? Lo primero es que leo todo el archivo y almaceno los datos en una lista genérica. Y luego, en un bucle, actualizo cada fila de la cuadrícula de datos donde estoy mostrando el progreso. – Cdeez

+0

Puede echar un vistazo al código agregado en la pregunta de qué estoy haciendo. – Cdeez

+0

Pocas ediciones de esta respuesta darán el resultado --- Los valores 'totalRead' y' totalFilesize' deben ser 'dobles', ya que si son enteros, el resultado es siempre un cero (un tipo de conversión del resultado a entero) y 100d * 0 = 0. Y es 'Math.Ceiling();' – Cdeez

Cuestiones relacionadas