C sharp - Ayuda con ProgressBar

 
Vista:

Ayuda con ProgressBar

Publicado por Cedric (4 intervenciones) el 04/10/2005 01:41:15
Estoy intentando hacer una barra de progreso mientras que hago la conversion de un archivo wav a mp2.
El problema es que parece q la barra va bien pero hay un momento en que el formulario se cuelga y no sigue, alguien me puede ayudar por favor.

System.IO.FileInfo archivo = new System.IO.FileInfo("d:/musica.mp2");
int size = (int)archivo.Length;
progressBar1.Minimum = 1;
progressBar1.Maximum = 4729077;
while (size < 4729077)
{
progressBar1.Increment(4729077 / size);

}

El valor 4729077 puede cambiar, es simplemente el tamaño resultante del archivo.
Lo que pretendo hacer es q el programa asigne a una variable el tamaño en bytes del archivo mientras el besweet lo genera, y que mientras el tamaño del archivo no coincida con el tamaño final (4729077) aumente la barra de progreso en parte proporcional a su maximo.

Espero haberme explicado bien
Gracias por adelantado.
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
sin imagen de perfil
Val: 46
Ha mantenido su posición en C sharp (en relación al último mes)
Gráfica de C sharp

RE:Ayuda con ProgressBar

Publicado por Yamil Bracho (1161 intervenciones) el 04/10/2005 03:39:39
No le estas dando chance al Task Manager de procesar la cola de mensajes. Para ello coloca dentro del loop la instruccion

Application.DoEvents()
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:Ayuda con ProgressBar

Publicado por Ayuda con ProgressBar (4 intervenciones) el 04/10/2005 16:20:28
Yamil, el metodo funciona pero con un problema que es que la barra de progreso se llena cuando ya ha acabado la conversion
Como puedo solucionar esto?
Gracias de todas formas

System.IO.FileInfo archivo = new System.IO.FileInfo("d:/musica.mpg");
int size = (int)archivo.Length;
progressBar1.Minimum = 1;
progressBar1.Maximum = 4729077;
while (size < 4729077)
{
progressBar1.Increment(4729077 / size);
Application.DoEvents();
}
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
sin imagen de perfil
Val: 46
Ha mantenido su posición en C sharp (en relación al último mes)
Gráfica de C sharp

RE:Ayuda con ProgressBar

Publicado por Yamil Bracho (1161 intervenciones) el 04/10/2005 18:12:36
Eso quiere decir que el proceso de conversion se esta ejecutando antes de que se refresque la barra.
Puedes hacer dos cosas. Una es colocar el refrescamiento de la barra en un Thread y la otra es que coloques el refrescamiento de la barra en el proceso que hace la conversion
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:Ayuda con ProgressBar

Publicado por Ayuda con ProgressBar (4 intervenciones) el 04/10/2005 20:33:21
este es el codigo que tengo puesto, no me funciona la barra ni aumenta ni nada...

System.Diagnostics.Process.Start("d:/besweet/besweet.exe", " -core( -input " + (char)34 + "d:/musica.wav" + (char)34 + " -output " + (char)34 + "d:/musica.mp2" + (char)34 + " -ota( -hybridgain ) -mp2enc( -m s -b 192 -e )");
System.IO.FileInfo archivo = new System.IO.FileInfo("d:/musica.mp2");
int size = (int)archivo.Length;
progressBar1.Minimum = 1;
progressBar1.Maximum = 4729077;
while (size < 4729077)
{
progressBar1.Increment(4729077 / size);
Application.DoEvents();
}

ni con app.doevents() ni na.Nose k acer.
Espero tu respuesta Yamil.
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
sin imagen de perfil
Val: 46
Ha mantenido su posición en C sharp (en relación al último mes)
Gráfica de C sharp

RE:Ayuda con ProgressBar

Publicado por Yamil Bracho (1161 intervenciones) el 04/10/2005 20:49:33
El problema es que el proceso esta fuera del contexto de tu aplicacion y es ejecutado por el sistema operativo sin tu tener el control de lo que esta haciendo. No se si el programa que estan ejecutando tenga algun tipo de notificacion que te permita saber que esta haciendo.Quizas colocando un timer dentro de tu formulario e interrogando la aplicacion via FindWindow o algun status en ese programa para saber que esta haciendo en este momento.
En este caso creo que no es posible hacerlo tal y como lo estamos pensando... :-(
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:Ayuda con ProgressBar

Publicado por Ayuda con ProgressBar (4 intervenciones) el 05/10/2005 00:15:21
Lo que pretendo es calcular cuanto tarda en hacer la conversion de un archivo de audio o video con el besweet o el ffmpeg.
Y la unica forma q se me ha ocurrido es la de calcular el tamaño final que va a tener el archivo y actualizar la barra de tareas segun ese tamaño.
Es decir que si con la calculadora de bitrate, tamaño, calculo q el tamaño va a ser 500 MB la barra de progreso tendra como ProgressBar.Maximum un valor de 500 y hasta q el archivo q se esta produciendo no tenga ese valor aumentara segun la proporcion:

numero de MB totales / numero de megas q lleva convertidos

Creo q me he explicado bien.

Entonces la pregunta es como puedo hacer que la barra de progreso se muestre en tiempo real a la vez que la aplicacion(besweet o ffmpeg) esta haciendo el progreso.
Y el metodo DoEvents() funciona en el momento de actualizar la barra pero no lo hace en timepo real.
Tambien lo he intendao con Threads y tampoco lo hace en tiempo real.
He visto programas que lo hacen pero no se como. Un ejemplo es el "Mewig" que es un GUI de conversion que usa mplayer y he estado mirando el codigo fuente y no consigo ver donde hace esa operacion.

http://sourceforge.net/projects/mewig ---> aqui esta el codigo fuente del Mewig

Espero tu contestacion. 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