Título: Ayuda con un Contador Publicado por: Tomas1982 en 26 Enero 2017, 16:00 pm Estoy tratando de agregarle un contador a una copia, pero no e logrado de que este se me actualice sin la necesidad de actualizar el form. Esto es lo que tengo.
Código
Al refrescar me parpadea el form. La idea es que este me enumere la cantidad de ficheros copiados. Saludos y gracias. Título: Re: Ayuda con un Contador Publicado por: Eleкtro en 28 Enero 2017, 20:44 pm Estoy tratando de agregarle un contador a una copia Hola. El problema que has planteado carece de la información necesaria, para empezar la sentencia del For está incompleta / no es compilable. Intenta ser más específico la próxima vez y al menos aportar un código/ejemplo funcional... no nos hagas asumir las cosas, esto es programación y requiere todos los detalles posibles por tu parte para evitar asunciones y preguntas recurrentes. se me actualice sin la necesidad de actualizar el form. Lo que ocurre es que estás realizando una operación "bloqueante" en el thread de la UI, es decir, estás ejecutando un búcle en el thread de la UI y hasta que el bloque del For no termine su ejecuión no podrás hacer nada más. Aparte de eso, refrescar el Form por completo es una operación expensiva y no hay necesidad de ello, en todo caso deberías refescar el Label/Control en el que necesites actualizar "X" información llamando al método Control.Update(). Con respecto al problema del bloqueo de la UI, la solución apropiada para llevar a cabo esto no es "hacer click y listo", se necesita un previo entendimiento y práctica por tu parte sobre la programación asincrónica en general. De todas formas te mostraré un ejemplo que puedes adaptar donde además te muestro el uso del paralelismo para acelerar la operación de copiado de archivos (o no. Depende, mientras no sean archivos de gran tamaño ok)... En fin, lo que hace el siguiente código, aparte de evitar el bloqueo de la UI claro está, es realizar una copia NO-recursiva de los archivos del directorio "A" al directorio "B", y mostrar el progreso de archivos copiados en el control que le pasemos a la función, en este caso un label. Código
Si por el momento este tipo de solución asincrónica te resultase incomprensible, entonces siempre puedes recurrir a llamar al método Application.DoEvents() en el For que has compartido al principio, y listo, pero te advierto que hacer eso es programación irresponsable y deberías evitarlo a toda costa por varios motivos que no viene al caso explicar ahora (a menos que tengas esa duda). Ejemplo: Código
Saludos! Título: Re: Ayuda con un Contador Publicado por: Tomas1982 en 31 Enero 2017, 20:06 pm Eleкtro: Evidentemente ese no es el código, simplemente quise poner una idea de lo que quería, como lo explique. El código completo donde realizo la copia es este.
Código
Darle una revisada para ver que me va mal y corregirlo. Saludossss Título: Re: Ayuda con un Contador Publicado por: Eleкtro en 1 Febrero 2017, 00:02 am Darle una revisada para ver que me va mal y corregirlo. Hola. Aquí no se aceptan órdenes, ni tampoco le hacemos el trabajo a nadie. Debo comentar algo, y es que ha habido una pequeña confusión. La primera vez que leí tu post donde explicaste el problema, por algún motivo me rallé (lo lei deprisa o algo, no se) y pensé que te referias a un problema de bloqueo de la UI, no a un problema de flickering, y te mostré dos soluciones diferentes enfocadas a evitar el bloqueo de la UI (que no el flickering), lo siento por eso. Lo bueno de esto es que de todas formas puedes aprovechar el primer ejemplo (el asincrónico) para adaptarlo y evitar llamar a "Me.Refresh()" ya que refrescar el Form/Todos los controles es el causante de lo que te ocurre. Empieza por leer a fondo la respuesta que te di donde digo que debes hacer en lugar de llamar a "Me.Refresh", y adaptar a tus necesidades aquél que mostré código. Ah, y para reducir (o en el mejor de los casos evitar) el flickering en WindowsForms siempre es bueno que actives la propiedad DoubleBuffered de tu Form. Saludos. |