Ir al contenido


Foto

Eventos del Formulario y ejecutar aplicaciones en un hilo

eventos form hilos

  • Por favor identifícate para responder
3 respuestas en este tema

#1 seba_13680

seba_13680

    Member

  • Miembros
  • PipPip
  • 27 mensajes

Escrito 03 abril 2017 - 01:42

Buenas tardes y saludos a todos

 

Continuando con un desarrollo de una aplicacion, basado en gran parte al servicio de Escafandra 

 

 

 

http://delphiaccess....de-un-servicio/


 

y a la posibilidad de lanzar aplicaciones como System

 

 

 

http://delphiaccess....ilegios-system/


 

Llegue a la parte de la aplicacion que hace las copias, utiliza el comando rsync.exe que es llamado por la funcion WinExecAndWait32

Sucede que el llamado al comando desde la funcion estan en el evento OnShow del formulario, y se tilda al hacer las copias, el formulario esta lento, intente en varios eventos del formulario pero el resultado es similar

leyendo al respecto, vi el siguiente foro en el que Agustin Ortu comenta lo siguiente

 

http://clubdelphi.co...hp?t-89626.html

 

 

 

El trabajo pesado no debe hacerse en los form, que son elementos para representar estados y datos, nada más.
El trabajo pesado se debe hacer lo más lejos posible del form ...

 

Me podrian explicar lo comentado o alguna referencia al respecto, y en lo posible explicar como es el uso de hilos para ejecutar tareas pesadas ?

y en caso de ser posible la ejecucion en hilos como podria adaptar algun grafico que indentifique el progreso, como un memo, una barra de progreso o alguna animacion?

 

el codigo de la aplicacion es el siguiente :


delphi
  1. begin
  2.  
  3. ComandoCuatro:=('c:\copias\bin\rsync --progress -avzPe /cygdrive/c/copias/bin/ssh.exe /cygdrive/c/origen1/ usuario@xxx.xxx.xxx.xxx:/home/usuario/destino1/');
  4. WinExecAndWait32(pchar(ComandoCuatro),SW_SHOW,INFINITE);
  5.  
  6. ComandoCinco:=('c:\copias\bin\rsync --progress -avzPe /cygdrive/c/copias/bin/ssh.exe /cygdrive/c/origen2/ usuario@xxx.xxx.xxx.xxx:/home/usuario/destino2/');
  7. WinExecAndWait32(pchar(ComandoCinco),SW_SHOW,INFINITE);
  8.  
  9. close;
  10. end;
  11. end.

desde ya muchas gracias por los comentarios u orientacion al respecto

Saludos ...


  • 0

#2 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 03 abril 2017 - 03:29

Por lo que veo haces las copias con aplicaciones externas que llamas con una función que llamas WinExecAndWait32. Por su nombre esa función espera a que termine la aplicación externa y eso te bloquea la aplicación principal.

1.- Cada App externa tiene su propio hilo, esto quiere decir que si ejecutas sin esperar a que termine, ya has solucionado el tema.

2.- Puedes meter WinExecAndWait32 en un hilo con lo que también solucionas el problema.

3.- El meter una barra de progreso depende de esa aplicación externa que usas pero siempre puedes hacer las copias desde tu programa, revisa este tema: Copiar archivos con CopyFileEx y barra de progreso en delphi

en ese tema también se explica como copiar con SHFileOperation

4. También te puede interesar:Copiar múltiples archivos y carpetas

 

Sobre el tema de los hilos revisa la clase TThread en la ayuda de Delphi, o estudia el tema a bajo nivel CreateThread aunque esto último no te lo recomiendo por ahora.

Aquí tienes un ejemplo del uso de una clase derivada de TThread para copiar archivos:

 

 

Saludos.


  • 0

#3 seba_13680

seba_13680

    Member

  • Miembros
  • PipPip
  • 27 mensajes

Escrito 04 abril 2017 - 08:17

Buen dia Escafandra y gracias por la pronta respuesta

Estoy leyendo al respecto sobre el tema de los hilos de ejecucion

Con respecto al punto 

 

 

 

2.- Puedes meter WinExecAndWait32 en un hilo con lo que también solucionas el problema.

 

Tiene algun ejemplo o link de como ingresar una funcion en un hilo y poder tener algun grafico que identifique el trabajo, que no afecte el rendimiento del Form?

 

 

El tema es que esta todo armado para ejecutar esa funcion y ese comando, ya que los script en Debian estan armados 

para la estructura de lo log's del comando rsync, y en todos los casos son copias a traves de internet y solo en pocos casos en una red interna

Los demas puntos los estoy estudiando para complementar la informacion

 

Desde ya gracias por las respuestas¡ saludos y buenas tardes¡ 


  • 0

#4 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 04 abril 2017 - 03:45

Tiene algun ejemplo o link de como ingresar una funcion en un hilo y poder tener algun grafico que identifique el trabajo, que no afecte el rendimiento del Form?

No tengo el ejemplo que te gustaría pero te diré que meter WinExecAndWait32 en un hilo con TThread es tan sencillo como ejecutarlo desde el método Execute de tu clase TThread. Lo de conseguir un estado del progreso va a depender de rsync. No estoy familiarizado con él, pero creo que tiene un modo verbose, eso es lo que debes investigar antes de plantearte el como vas a representar el progreso.

 

Saludos.


  • 1




IP.Board spam blocked by CleanTalk.