Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Duda al enviar archvio por socket mediante hilos (https://www.clubdelphi.com/foros/showthread.php?t=75459)

maxinitto 25-08-2011 13:36:01

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.

maxinitto 31-08-2011 13:56:21

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.

Chris 01-09-2011 00:04:19

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

maxinitto 01-09-2011 01:14:33

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.

Chris 01-09-2011 19:07:22

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".

maxinitto 02-09-2011 04:15:29

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.

Chris 02-09-2011 23:20:46

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

maxinitto 03-09-2011 18:04:36

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.


La franja horaria es GMT +2. Ahora son las 15:51:08.

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