FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Crear Hilos de Ejecución con TIdFTP
Buenas tardes, he subido un archivo por ftp con los componentes indy usando el siguiente código
FTP := TIdFTP.Create( nil ); FTP.OnWork := FTPWork; FTP.Username := miusuario; FTP.Password := miclave; FTP.Host := localhost; try FTP.Connect; except raise Exception.Create( 'No se ha podido conectar con el servidor ' + FTP.Host ); end; FTP.Put( sArchivo, ExtractFileName( sArchivo ), False ); FTP.Disconnect; FTP.Free; Cuando subo un archivo no hay problema, el problema viene cuando intento subir muchos archivos casi que a la ves, me saca el siguiente error raised exception class EIDSocketError with message 'Socket Error # 10048 Address already in use.' Process stopped. Use Step or Run to continue. Hey leído y una posible solución seria crear varios hilos de ejecución. pero a que se refieren con hilos, crear en tiempo de ejecución varios TidFTP ??? Como logra hacer esto o solucionar este problema muchas gracias de ante mano.
__________________
JaiMelendez |
#2
|
||||
|
||||
Recuerda poner los tags al código fuente, ejemplo:
Gracias |
#3
|
|||
|
|||
Gracias casimiro, lo tendré en cuenta para la próxima.
__________________
JaiMelendez |
#4
|
||||
|
||||
Hola JAI_ME
Para el tema de los hilos de ejecución, te recomiendo leas un poco al respecto. - Los Hilos de Ejecución - Threading in Delphi Eso te dará algunas ideas de como implementar lo que necesitas sobre los hilos de ejecución o te aclarará si necesariamente los requieres para solucionar tus problemas.
__________________
Buena caza y buen remar... http://mivaler.blogspot.com |
#5
|
||||
|
||||
De todas formas, si quieres hacerlo con lo que tienes ahora, puedes controlar al llamar a esa función si ya está enviando algo, en ese caso esperas.
Puedes meter todos los envíos en una cola, una simple lista, y un timer que vaya comprobando si ya acabó de enviar, en cuanto está libre entonces envía el siguiente de la cola, y hasta que se terminen todos. |
#6
|
|||
|
|||
Cita:
En un boton tengo el siguiente código donde hago la llamada al procedimiento que envia al servidor Cita:
como se dan cuenta envío el mismo archivo al servidor y hay veces que envía mas de 1000 archivos sin sacar el error, en este ejemplo como implemento lo que me comentas. PD. la función subirArchivo tiene el código que expuse al principio.
__________________
JaiMelendez |
#7
|
||||
|
||||
No, así no, hazlo con un Timer, le pones que se ejecute cada 1 segundo, por ejemplo, y en su evento 'execute' haces la llamada a subirarchivo con el que toque de la lista que tengas.
A ver si encuentro un ejemplo... |
#8
|
||||
|
||||
JAI_ME,
Cita:
El código anterior envía múltiples archivos vía FTP usando dos métodos: 1- Enviando múltiples archivos de forma individual (Uno a Uno). 2- Enviando múltiples archivos de forma simultanea por medio de Threads. Nota: 1- Los archivos se pueden seleccionar por medio de un TOpenDialog que permite selección multiple. 2- La cantidad de Bytes enviados al servidor FTP se controla por medio de un TProgressBar. Cita:
La aplicación fue realizada en Delphi 7 usando el Componente FTP de Indy 9. La aplicación esta implementada en el siguiente link: FTPUpload_MultiFiles.rar Espero sea útil Nelson. Última edición por nlsgarcia fecha: 27-04-2015 a las 22:13:44. |
#9
|
||||
|
||||
Está muy bien esa solución.
Aunque para estas cosas no sé yo si vale la pena, me explico: si tiene que subir 1000 archivos entonces tardará según el ancho de banda que tenga. Si usa hilos lo único que se consigue es que en lugar de subir un archivo a, por ejemplo, 1 mega, subirán 2 a medio mega, 4 a un cuarto de mega, etc. o sea, que no se reducirá el tiempo. Es por lo que personalmente prefiero subir uno a uno, ya que el tiempo para subirlos no va a mejorar, así que no lo encuentro muy necesario. Es sólo una preferencia personal. Tengo algunos programitas que hacen eso, por ejemplo, uno de ellos sube imágenes casi diariamente (por FTP) a una web, son imágenes pequeñas (10 a 50 Kb), aunque son muchas (alrededor de 20 ó 30 mil) y lo hace una a una. Por supuesto, envía una cuando ha acabado con otra, no se intenta enviar todas al mismo tiempo, que es el problema que no ha controlado JAI_ME. De todas formas, la solución propuesta nlsgarcia es excelente.
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código Únete al grupo Teaming clubdelphi | Colabora mediante Paypal Última edición por Casimiro Notevi fecha: 28-11-2012 a las 12:11:33. |
#10
|
|||
|
|||
Error en el acceso al Form
Hola a todos,
gracias nslgarcia por el código propuesto. Tengo un problema con el código que he utilizado yo para enviar mediante un TidSMTP un correo electrónico. El problema me aparece en mi código pero tambien en el proyecto que he descargado en el link que nos indicas. En estas dos funciones, al acceder al Formulario para añadir las lineas en el Memo1, me devuelve un "Access Violation".
¿Alguna idea? |
#11
|
||||
|
||||
Broskil Giovann,
Cita:
1- El código señalado en el Msg #8 funciona correctamente en Delphi 7 usando el Componente FTP de Indy 9 bajo Windows 7 Professional x32. 2-El código señalado es para enviar archivos a un servidor FTP, no para el envío de emails. Pregunto: 1- ¿Que versión de Windows, Delphi y Indy utilizas?. 2- ¿Podrías publicar el error que te aparece en el código del Msg #8?. 3- ¿Si usas la opción de Envío de Archivos Simple (Uno a uno) funciona?. Cita:
Espero sea útil Nelson. Última edición por nlsgarcia fecha: 11-12-2013 a las 23:03:24. |
#12
|
|||||||
|
|||||||
Muchas gracias Nelson,
contesto a tus comentarios... Cita:
Cita:
Cita:
Cita:
* Delphi 7 * Indy 10.5.5 Cita:
Cita:
Cita:
Y la creación del Form:
El error aparece en:
Cuando en el Execute se llama a
En Debug, poniendo un break en la linea donde me aparece el Access Violation, el F_PS025 lo tengo a "nil" y sus componentes no tienen valor... Jose. |
#13
|
||||
|
||||
Broskil Giovann,
Cita:
1- La función EnviarCorreoAdjunto instancia y libera el formulario TF_PS025. 2- La declaración de la función EnviarCorreoAdjunto esta en en código del Msg #12, pero la llamada a la función ¿Donde esta?. 3- Al parecer, según lo mostrado en el código del Msg #12, el formulario TF_PS025 no esta instanciado y por ello al ejecutar Synchronize(EnvioFinalizado) se produce el error de Access Violation, dado que se trata de acceder en runtime a un objeto que no ha sido creado previamente. 4- Revisa este código: El código anterior instancia y libera el formulario TForm2 por medio de la función ShowModalForm2 y carga 11 líneas en el componente TMemo1, si se comenta la línea Form2 := TForm2.Create(nil) se producirá un Access Violation (Gestionado por try...except statements), al ejecutar la línea Memo1.Lines.Add('Line-' + IntToStr(i) + ' ' + Msg) dado que el objeto que contiene al componente nunca fue creado. Espero sea útil Nelson. Última edición por nlsgarcia fecha: 13-12-2013 a las 18:49:23. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Ayuda con Hilos de ejecucion | kurono | Varios | 19 | 15-01-2011 15:36:40 |
Problema con hilos de ejecucion | gueritox | OOP | 1 | 14-08-2010 15:26:06 |
como crear hilos de ejecucion en delphi 2007 | pablopessoa | Varios | 1 | 23-10-2008 19:11:08 |
Aplicacion con varios Hilos de Ejecución | samantha jones | Varios | 1 | 02-03-2005 17:27:24 |
Hilos de ejecucion | el toluca | Varios | 2 | 29-06-2004 22:59:04 |
|