IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lazarus Pascal Discussion :

Programme freeze à cause de TTCPBlockSocket [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Cyberdocumentaliste
    Inscrit en
    Décembre 2021
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Cyberdocumentaliste
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2021
    Messages : 11
    Par défaut Programme freeze à cause de TTCPBlockSocket
    Bonjour,

    j'ai actuellement plusieurs appareils qui fonctionnent en scpi/ethernet, une alimentation industrielle et un boîtier de mesure. Mon probleme est que si un des appareils est coupé, quand Lazarus envoie la commande, Lazarus plante direct ; le probleme c'est que en cas d'erreur rien ne permet d'arrêter avant que ça plante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    cmd2:='CONF:VOLT:DC AUTO , (@'+listeTENSIONS+')';
        IP.EcritureIP(IP_KEYSIGHT_VOIE_1,PORT_KEYSIGHT_VOIE_1,cmd2);
     
    function TComIP.ecritureIP(IP, port, Txt_cde : string):String; // cette partie là n'est pas dans le méme form (PCommunicationIP)
    Var sock : TTCPBlockSocket;
      S : string;
    begin
      Sock := TTCPBlockSocket.Create;
      try
        Sock.Connect(IP , port); /////// ca plante ici !!
        Sock.SendString(Txt_cde+#13+#10);
        Sock.CloseSocket;
      finally
        Sock.Free;
      end;
        Result  := s;
    end;  
     
    procedure TBlockSocket.Connect(IP, Port: string);  // cette partie là n'est pas dans le méme form (blcksock)
    var
      Sin: TVarSin;
      b: boolean;
    begin
      SetSin(Sin, IP, Port);
      if FLastError = 0 then
      begin
        if FSocket = INVALID_SOCKET then
          InternalCreateSocket(Sin);
        if FConnectionTimeout > 0 then
        begin
          // connect in non-blocking mode
          b := NonBlockMode;
          NonBlockMode := true;
          SockCheck(synsock.Connect(FSocket, Sin));
          if (FLastError = WSAEINPROGRESS) OR (FLastError = WSAEWOULDBLOCK) then
            if not CanWrite(FConnectionTimeout) then
              FLastError := WSAETIMEDOUT;
          NonBlockMode := b;
        end
        else
          SockCheck(synsock.Connect(FSocket, Sin));
        if FLastError = 0 then
          GetSins;
        FBuffer := '';
        FLastCR := False;
        FLastLF := False;
      end;
      ExceptCheck;
      DoStatus(HR_Connect, IP + ':' + Port);
    end;

  2. #2
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 159
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 159
    Par défaut
    Bonjour,

    Citation Envoyé par leonick12 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    function TComIP.ecritureIP(IP, port, Txt_cde : string):String; // cette partie là n'est pas dans le méme form (PCommunicationIP)
    Var sock : TTCPBlockSocket;
      S : string;
    begin
      Sock := TTCPBlockSocket.Create; 
      try
        Sock.Connect(IP , port); /////// ca plante ici !!
        ...
    Je ne vois aucun test de validité du résultat des actions, c'est pas glop.
    Je ne connais pas du tout ton TTCPBlockSocket, donc à adapter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    begin
      Sock := 0; // si c'est un handle, par exemple
      Sock := TTCPBlockSocket.Create; 
      if Sock = 0 then begin ShowMessage('sock error'); exit; end;
      try
        if not Sock.Connect(IP , port) then begin ShowMessage('connect error'); exit; end;

  3. #3
    Membre averti
    Homme Profil pro
    Cyberdocumentaliste
    Inscrit en
    Décembre 2021
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Cyberdocumentaliste
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2021
    Messages : 11
    Par défaut
    voila la solution qu'on a trouvé et qui fonctionne correctement, avec ca au moins plus de freeze.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    function TComIP.LectureIP(ip, port, text_cmd : string):String;
    Var
      sock : TTCPBlockSocket;
      S : String;
    begin
      Sock := TTCPBlockSocket.Create;
      Sock.RaiseExcept      :=true;
      Sock.ConnectionTimeout:=1200;
      try
        Sock.Connect(ip , port);
        Sock.SendString(text_cmd+#13+#10);
        s := Sock.RecvPacket(7000);
        Sock.CloseSocket;
      except
      on e: ESynapseError do
         begin
        //Showmessage('message');
        Result  := 'erreur';
     
          end;
     
    end;
         Sock.Free;
        Result  := s;
     
    end;

  4. #4
    Membre chevronné

    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 181
    Par défaut
    Bonjour,

    Il y a quand même plusieurs choses qui me chiffonnent dans votre code "résolu".

    Le principal est que dans le cas d'une exception, vous n'aurez jamais 'erreur' comme résultat de la fonction, parce que vous lui attribuez la valeur de s ultérieurement !
    En plus, la variable s n'est pas initialisée.
    Enfin, si la création de sock échoue, une exception se produira quand vous voudrez la libérer...
    Et plutôt que de retourner "erreur", pourquoi ne pas ajouter le message d'erreur lui même ?

    Donc, je vous propose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    function TForm1.LectureIP(ip, port, text_cmd : string):String;
    Var
      sock : TTCPBlockSocket;
    begin
      result:= '';                               // initialiser result
      try
        Sock := TTCPBlockSocket.Create;
        Sock.RaiseExcept      :=true;
        Sock.ConnectionTimeout:=1200;
        Sock.Connect(ip , port);
        Sock.SendString(text_cmd+#13+#10);
        result := Sock.RecvPacket(7000);
        Sock.CloseSocket;
      except
        on e: ESynapseError do
        begin
          result:= '';                             // Dans le cas ou l'exception se produit lors de la fermeture du soccket     
          Showmessage('erreur '+e.Message);        // ou ce que vous voulez pour indiquer au programme qu'il y a une erreur
        end;
      end;
      if assigned (Sock) then Sock.Free;           // seulement si sock a bien été créé
    end;
    S'il y a une exception, on a une alerte et le résultat est une chaîne nulle. Si on a une erreur sans exception, on a aussi une chaîne nulle, mais pas d'alerte

    bb84000

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 941
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 941
    Par défaut
    Si la création de sock échoue, ça ne signifie pas pour autant que sock vaille nil puisqu'il n'est pas initialiser non plus
    De plus il n'y aura aucun retour d'information puisque uniquement un type d'exception est traité.

  6. #6
    Membre chevronné

    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 181
    Par défaut
    Bonjour,

    Citation Envoyé par Andnotor Voir le message
    Si la création de sock échoue, ça ne signifie pas pour autant que sock vaille nil puisqu'il n'est pas initialiser non plus
    Ce qui me conduit à poser plusieurs questions existentielles à venir !

    Citation Envoyé par Andnotor Voir le message
    De plus il n'y aura aucun retour d'information puisque uniquement un type d'exception est traité.
    oui.

    bb84000

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Programme freeze, aide ajouter thread
    Par deli2025 dans le forum C#
    Réponses: 3
    Dernier message: 22/04/2011, 09h46
  2. [WS 2003] freeze cause VIRUS ou autre chose
    Par djbad dans le forum Windows Serveur
    Réponses: 4
    Dernier message: 21/12/2010, 09h46
  3. Programme Freeze ?
    Par Talimidiusnx dans le forum VB.NET
    Réponses: 5
    Dernier message: 30/10/2010, 23h03
  4. Freeze d'un programme
    Par zoullou dans le forum Général Java
    Réponses: 3
    Dernier message: 17/01/2007, 16h51
  5. Pas d'erreur au debugage mais le programme freeze
    Par bob2356 dans le forum VC++ .NET
    Réponses: 3
    Dernier message: 25/09/2006, 19h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo