Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-08-2011
maxinitto maxinitto is offline
Miembro
 
Registrado: may 2010
Posts: 45
Poder: 0
maxinitto Va por buen camino
Duda al enviar archvio por socket mediante hilos

Hola:

Hace un poco de tiempo, me resolvieron un problema aqui de como enviar archivos con los socket que trae delphi....

Ahora mi pregunta es, (el tema esta en este enlace, al final de la pagina esta el .zip el que se trato en dicho dia), ¿Como puedo ejecutar el codigo que esta en el clientread, que es cuando recibe las partes del archivo, en un hilo?, por mas y mas que busco en internet no consigo saber como hacerlo, ya que si meto ese codigo en un procedimiento definido por mi no podria obtener el socket.recievelength ni el recievebuf...

gracias de antemano.
Responder Con Cita
  #2  
Antiguo 31-08-2011
maxinitto maxinitto is offline
Miembro
 
Registrado: may 2010
Posts: 45
Poder: 0
maxinitto Va por buen camino
bueno veo que nadie contesta, he pensado que puede ser por falta de informacion, bueno aquie adjunto el codigo del evento onread de mi socket, la conexion es inversa...

Código Delphi [-]
procedure TForm4.c3ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
  Buffer: array [0..9999] of Char;
  IncommingLen, RecievedLen: integer;
  PesoDeArchivo, PartFileRec : Int64;
begin

  if RecibiendoArchivo then
  begin
    PesoDeArchivo := StrToInt64(FileSizes) div 1024;
    Form4.PB_ProgresoArchivo.Max := PesoDeArchivo;

    Form4.Timer1.Enabled := True;

    IncommingLen := Socket.ReceiveLength;;

    while IncommingLen > 0 do
    begin
       RecievedLen := socket.ReceiveBuf(Buffer, Sizeof(Buffer));
       PartFileRec := RecievedLen div 1024;

  
       Form4.PB_ProgresoArchivo.Position := Form4.PB_ProgresoArchivo.Position + PartFileRec;
       Form4.L_ProgresoKB.Caption := IntToStr(Form4.PB_ProgresoArchivo.Position) + ' KB / ' + IntToStr(Form4.PB_ProgresoArchivo.Max) + ' KB';

    if PartFileRec <= 0 then
       Break
    else
      Form4.FStream.Write(Buffer, RecievedLen);


    if Form4.FStream.Size >= StrToInt64(FileSizes) then
    begin

       Form4.FStream.Free;
       Form4.Timer1.Enabled := False;
       Form4.TimeTaken := 0;
       RecibiendoArchivo := False;
       ActualizarYmostrar(GetFileIcon(Form4.E_RutaLocal.Text +        Form2.NombreArchivoRecibido));
       Break;                                                                        
    end;
  end;
  end;
end;

si este codigo lo meto en otro procedimiento declarado por mi, no puedo hacer referencia ala variable socket, es decir , no sabria que socket me esta enviando las partes de archivo...¿como lo puedo hacer para meterlo en un hilo?, lo quiero meter en el hilo por que la aplicacion se me cuelga y se me recupera constantemente hasta que llega el archivo.
Responder Con Cita
  #3  
Antiguo 01-09-2011
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
Hola max!

Realmente no comprendo lo que quieres, o es que tú no estás entendiendo el problema y por eso no sabes como solucionarlo.

Explícate mejor lo que deseas. Una idea global de lo que quieres, y cómo has intentado o estás intentando obtenerlo.

Saludos,
Chris
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #4  
Antiguo 01-09-2011
maxinitto maxinitto is offline
Miembro
 
Registrado: may 2010
Posts: 45
Poder: 0
maxinitto Va por buen camino
Hola, muchas gracias por contestar jejeje este tema me lleva loco unos dias jejeje, nada pues es muy siemple lo que quiero hacer es lo siguiente:

Ese codigo es el que yo uso en el evento onread del cliente 2, osea yo tengo 2 TclientSocket y 2 Tserversocket cada uno en su correspondiente proyecto, bien, desde el server 1 envio el nombre y el peso del arhivo al cliente 1, bien en el onread del server 1 recibo eso, lo asigno a sus correspondientes variables y activo una variable llamada recibiendoarchivo a true, bien, despues el server 2, en encarga de ir enviando las partes del archivo al cliente 2 y ya se ejecuta este codigo.

Mi problema: Que la aplicacion hasta que termina de recibir todo el archivo se va quedando colgada.

Lo que quiero hacer o intento xdd: buscar la manera de hacer todo esto en un thread para que la aplicacion no se cuelgue, pero por mas y mas que he buscado y he leido no lo logro hacer.

Espero haber sido claro, gracias.
Responder Con Cita
  #5  
Antiguo 01-09-2011
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
Hola!

Ahora entiendo tu problema y lo que quieres. Mira, la forma en como implementar aplicaciones multihilo depende de cada caso. Intenté escribirte un pseudo código para guiarte pero me ha detinido no comprender muy bien el uso que le das a ciertas variables. Por ejemplo:
  1. FStream
  2. RecibiendoArchivo
  3. E_RutaLocal
  4. NombreArchivoRecibido


El pseudo código que te tengo es este:
Código Delphi [-]
type
    TThreadedSocketRead = class(TThread)
    private
        FSocket: TCustomWinSocket;
        FReceiveStream: TStream;
        FProgressForm: TForm;
        procedure Execute; override;
    published
        constructor ReadSocket(Socket: TCustomWinSocket;
                               ReceiveStream: TStream;
                               ProgressForm: TForm;
                               const StartSuspended: Boolean = False);
    end;
    
    // ...
    
implementation

constructor TThreadedSocketRead.ReadSocket(Socket: TCustomWinSocket;
                                           ReceiveStream: TStream;
                                           ProgressForm: TForm; 
                                           const StartSuspended: Boolean);
begin
    inherited Create(StartSuspended);
    Self.FSocket := Socket;
    Self.FReceiveStream := ReceiveStream;
    Self.FProgressForm := ProgressForm;
end;

procedure TThreadedSocketRead.Execute;
var
    Buffer: arrat[0.. 9999] of Char;
    IncommingLength, Receivelength, FileSize, KBPart: Int64;
begin
    inherited;
    
    // descargar y procesar los datos del socket
    
end;

Por otro lado, en este código, estás utilizando la variable global "Form4" que no es recomendable bajo ninguna circunstancia. Utiliza "Self" en lugar de "Form4".
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #6  
Antiguo 02-09-2011
maxinitto maxinitto is offline
Miembro
 
Registrado: may 2010
Posts: 45
Poder: 0
maxinitto Va por buen camino
ok, pero... ¿que hago con esto?, si yo envio el stream desde el server 2, ¿como hago yo para conectar el socket del hilo con el server 2? y ¿cuando invoco el execute del hilo? puff no tengo ni zorra idea jajaja nunca se me ha resistido nada en delphi y los putos hilos hablando bien me tienen hasta los hu....

Saludos y gracias por contesta, esperare tu respuesta.
Responder Con Cita
  #7  
Antiguo 02-09-2011
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
No se trata que vallas a utilizar ese código. Te había dicho que ese código no está terminado aún. Es solo el esqueleto -por decirlo de cierta manera- de cómo debería implementarse según mi experiencia en aplicaciones multihilo. Te comenté que no sabía el significado o uso de algunas variables. Por ese desconocimiento es que no pude escribir un código más preciso.

Saludos,
Chris
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #8  
Antiguo 03-09-2011
maxinitto maxinitto is offline
Miembro
 
Registrado: may 2010
Posts: 45
Poder: 0
maxinitto Va por buen camino
FStream - Es una variable que tengo como globlal asi no tengo que declararla en diferentes procedimientos, q es de tipo TFileStream
RecibiendoArchivo - Es un variable booelana, que cuando yo envio el nombre y el peso del archivo crear el archivo y esta variable la activo a true para que asi en el evento onread del cliente 2 puede ejecutarse el codigo
E_RutaLocal - Es un componente text del cual escojo el string para tener la ruta del archivo.
NombreArchivoRecibido - Esta como su nombre dice seria el nombre del archivo que recibimos es una paranolla de todos modos no le des importancia esas variables no interfieren a la hora de recibir el archivo yo las uso para hacer otras cosas, pero si no estubieran el codigo funcionaria igualmente, esto es para un filemanager que estoy haciendo.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Duda con implementacion de Threads(Hilos) gersojn Varios 1 16-08-2011 09:36:33
Enviar mail Socket error #11004 monicasierrar Varios 0 08-03-2008 18:27:32
Enviar una estructura de datos a traves de Socket en Delphi ygkw API de Windows 3 29-06-2006 21:53:48
Enviar archivo por socket. 'TStream' y 'TFileStream' Incompatibles. Sr_Sombrero Internet 6 01-07-2004 07:45:37
Enviar imagen o archivo por socket DarkByte Internet 5 11-09-2003 15:16:16


La franja horaria es GMT +2. Ahora son las 13:03:28.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi