Jump to content


Photo

Como crear multihilos en una aplicación


  • Please log in to reply
6 replies to this topic

#1 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14460 posts
  • LocationMéxico

Posted 02 March 2012 - 11:28 AM

Hola

A partir de éste tema he resuelto (gracias a los masters del API :)) de manera parcial mi desarrollo.

Ahora viene la parte del programa SERVER, con lo que tengo funciona muy bien cuando se recibe un archivo a la vez, la complicación viene cuando llegan varios archivos de forma simultánea o cuando el programa está "ocupado" procesando otro archivo.

¿Como puedo hacer para recibir todos los archivos de forma simultánea ?

Estoy usando el componente TServerSocket y el código es el siguiente.



delphi
  1. procedure TForm1.ServerSocketAccept(Sender: TObject; Socket: TCustomWinSocket);
  2. begin
  3.   Statusbar1.Panels[0].Text := 'Conectando desde: ' + Socket.RemoteAddress;
  4.   Archivo:= TStringList.Create;
  5.   Data := '';
  6.   Longitud := 0;
  7. end;
  8.  
  9. procedure TForm1.ServerSocketClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
  10. begin
  11.   Statusbar1.Panels[0].Text := 'No hay cliente conectando';
  12.   Archivo.Free;
  13. end;
  14.  
  15. procedure TForm1.ServerSocketClientRead(Sender: TObject; Socket: TCustomWinSocket);
  16. begin
  17.   ZeroMemory(@Buffer[0], sizeof(Buffer));
  18.   uLen := Socket.ReceiveBuf(Buffer,SizeOf(Buffer));
  19.   if uLen < 0 then
  20.   begin
  21.     uByte := -1;
  22.     Socket.SendBuf(uByte,1);
  23.     memo1.Lines.Add( '' );
  24.     exit;
  25.   end
  26.   else begin
  27.         Data := Data + string(PChar(@Buffer));
  28.         memo1.Lines.add( string(PChar(@Buffer)) );
  29.         if uLen < 1024 then
  30.         begin
  31.           memo1.Lines.Add( DirRec + Cadena );
  32.           Archivo.Text := Data;
  33.           Archivo.SaveToFile( DirRec + cadena );
  34.           uByte := 0;
  35.           Socket.SendBuf(uByte,sizeof(uByte));
  36.         end;
  37.   end;
  38. end;



Como hago para que se generen hilos y evitar los posibles errores.

Saludos y gracias.
  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14460 posts
  • LocationMéxico

Posted 02 March 2012 - 12:30 PM

Me parece que me aloqué, acabo de hacer una prueba de enviar varios archivos y los recibió correctamente, haré mas pruebas y les comento como va el asunto. :)

Saludos


  • 0

#3 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1750 posts
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Posted 02 March 2012 - 01:31 PM

Me parece que me aloqué...


El fantasma de "yo pregunto, yo me contesto" ataca de nuevooo  :D :D :D :D :D :D :D :D
  • 0

#4 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14460 posts
  • LocationMéxico

Posted 02 March 2012 - 01:47 PM


Me parece que me aloqué...


El fantasma de "yo pregunto, yo me contesto" ataca de nuevooo  :D :D :D :D :D :D :D :D


Se pega mi estimado, se pega :D :D :D

Saludos
  • 0

#5 seoane

seoane

    Advanced Member

  • Administrador
  • 1259 posts
  • LocationEspaña

Posted 04 March 2012 - 06:38 AM

No debería de haber problemas cuando te lleguen varias conexiones a la vez, simplemente esperaran su turno mientras las atiendes una a una. Siempre que no estemos hablando de un a autentica avalancha que desborde los buffers del sistema, pero contra eso poco puedes hacer.
  • 0

#6 syed20

syed20

    Newbie

  • Miembros
  • Pip
  • 1 posts

Posted 25 October 2014 - 06:24 AM

Bueno estoy depurando una aplicacion y mi codigo esta mayormente en delphi asi que encontre unos ejemplos los cuales me sirven en mi caso, si estuviera en C pero lo que no ocurre nose si alguien tiene similares add log como estos:

  • 0

#7 genriquez

genriquez

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 539 posts
  • LocationCali, Colombia

Posted 25 October 2014 - 07:57 AM

Hola

Veo que este hilo es bastante antiguo y no sé si ya lo resolvieron.  pero he aquí mi respuesta por si alguien la llega a necesitar.


en el método 15.procedure TForm1.ServerSocketClientRead(Sender: TObject; Socket: TCustomWinSocket);  se pasa como parámetro un TCustomWinSocket, el cual representa la conexión con un solo cliente,  si existen 10 clientes, se ejecutará 10 veces la misma función pero cada vez con un TCustomWinSocket diferente.

Asi que es fácil crear una instancia de la tarea pasándole la variable Socket : TCustomWinSocket y esta se encargará de atender esa conexión hasta que termine.

Espero sea de ayuda.

Saludos.
  • 0




IP.Board spam blocked by CleanTalk.