Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-05-2019
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.457
Poder: 20
newtron Va camino a la fama
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
__________________
Be water my friend.

Última edición por Casimiro Notevi fecha: 08-05-2019 a las 19:33:09.
Responder Con Cita
  #2  
Antiguo 08-05-2019
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿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".
Responder Con Cita
  #3  
Antiguo 08-05-2019
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.457
Poder: 20
newtron Va camino a la fama
Cita:
Empezado por Casimiro Notevi Ver Mensaje
¿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
__________________
Be water my friend.
Responder Con Cita
  #4  
Antiguo 09-05-2019
bucanero bucanero is offline
Miembro
 
Registrado: nov 2013
Ubicación: Almería, España
Posts: 208
Poder: 11
bucanero Va camino a la fama
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;
Responder Con Cita
  #5  
Antiguo 10-05-2019
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.457
Poder: 20
newtron Va camino a la fama
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.
__________________
Be water my friend.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
IdcmdTCPClient o ClientSocket LIGERO Internet 0 26-12-2017 15:00:29
ClientSocket Parsec Internet 3 07-07-2014 09:48:11
Problemas con Clientsocket Shadowng Internet 5 23-06-2008 22:43:16
Serversocket y Clientsocket Dragon Varios 3 03-05-2006 07:11:36
ClientSocket / serverSocket VRO Varios 2 20-10-2005 19:46:51


La franja horaria es GMT +2. Ahora son las 21:59:11.


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