Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Comportamiento ClientSocket (https://www.clubdelphi.com/foros/showthread.php?t=93916)

newtron 08-05-2019 18:06:17

Comportamiento ClientSocket
 
Hola a tod@s.

Estoy integrando a mi programa de restauración un cajón portamonedas de AZCOYEN. La comunicación se hace mediante sockets enviando y recibiendo mensajes. En un programa de prueba que he preparado abro el ClientSocket con la IP y el PUERTO correspondientes y picando en un botón envío un "string" para inicializar el cajón y ponerlo disponible para recibir mensajes, todo esto sin mayor problema.

Es decir, en el .create (o en el .show) pongo:

ClientSocket.Active := True;

y en el botón pongo:

ClientSocket.Socket.SendText('#I#');

Todo esto funciona OK.

El problema me viene cuando quiero que cuando se abra el programa haga estas dos operaciones de forma automática, es decir, que abra el ClientSocket e inmediatamente después me envíe el "string" para inicializar el cajón.

Es decir, en el .create (o en el .show) pongo:

ClientSocket.Active := True;
ClientSocket.Socket.SendText('#I#');

y hace caso omiso de la segunda línea porque el "ClientSocket" sigue estando a False cuando se hace el .SendText.

¿Alguien me puede indicar cómo puedo resolver esto?

Gracias y un saludo

Casimiro Notevi 08-05-2019 18:35:33

¿Puede ser que no haya tenido tiempo el "Active" y la línea que envía el comando no funciona porque está todavía "no activo"?
Por probar, pon un tiempo de espera entre ambas líneas.
También supongo que tendrás un socket.close en algún sitio para que no se quede "abierto".

newtron 08-05-2019 18:40:52

Cita:

Empezado por Casimiro Notevi (Mensaje 531887)
¿Puede ser que no haya tenido tiempo el "Active" y la línea que envía el comando no funciona porque está todavía "no activo"?
Por probar, pon un tiempo de espera entre ambas líneas.
También supongo que tendrás un socket.close en algún sitio para que no se quede "abierto".


Ya he probado poniendo tiempos de espera con Sleep(...) y nada. Efectivamente se hace un "close" pero cuando se cierra la aplicación.


Gracias y un saludo

bucanero 09-05-2019 10:44:08

Hola a todos!!

puede ser que necesites hacer un Application.processMessages después de intentar conectar para que el componente detecte el cambio de estado, en cualquier caso ¿Que tipo de error te genera?

Intenta probar con este código
Código Delphi [-]
procedure TForm2.TestConnection;
var
  intentos: integer;
begin
  try
    try
      intentos := 30;
      ClientSocket1.Open;
      while (intentos > 0) and not ClientSocket1.Active do begin
        Application.ProcessMessages;
        Sleep(250);
        Dec(intentos);
      end;
      ClientSocket1.Socket.SendText('#I#');

      /// ...

    finally
      if ClientSocket1.Active then
        ClientSocket1.Close;
    end;
  except
    on e: Exception do
      MessageDlg(E.Message, mtError, [mbOK], 0);
  end;
end;

newtron 10-05-2019 10:08:25

Bucanero.


Gracias por contestar.


El tema es que lo que planteas básicamente es también esperar (más o menos tiempo) a que se active el ClientSocket y no se activa.


He estado mirando por internet y he visto que hay dos formas de tratar este componente, una con el parámetro "ctBlocking" y otra con el parámetro "ctNonBlocking". La verdad es que no sé muy bien la diferencia que hay entre una forma y otra pero si parece que los eventos los disparan de distinta manera. Por defecto viene "ctNonblocking", si lo cambio a "ctBlocking" si me activa al tirón pero tiene la contrapartida de que no se activa el evento "OnRead" por lo que hay que consultar el resultado manualmente cuando se envía cualquier cosa.


P.e.:


Código Delphi [-]
    ClientSocket1.ClientType := ctBlocking;
    ClientSocket1.Open;
    ClientSocket1.Socket.SendText('#I#');
    Raw:='';
    while Raw='' do begin
      Raw:=ClientSocket1.Socket.ReceiveText;
    end;
    ShowMessage(Raw);


Yo creo que con esto me apaño.


Gracias a todos.


La franja horaria es GMT +2. Ahora son las 15:26:20.

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