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

C Discussion :

Executer une action toute les x secondes.


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 302
    Par défaut Executer une action toute les x secondes.
    Bonjour ...

    Voila, je pense que le titre est assez explicite ...

    Mais je vais vous planter le décors ...

    J'ai réaliser un code que je compile en une DLL ... Cette dll je vais l'inclure dans labView (si vous connaissez) pour pouvoir utiliser les fonctions de ma dll.

    La fonction que j'appelle est une peu sur le principe de grafcet !

    Donc c'est une suite d'instruction avec des étapes ...

    Dans une des étapes, je dois faire une demande toute les secondes +/- ...

    Pour l'instant ce que je fais, c'est que j'utilise une variable que j'incremente a chaque passage dans ma boucle et quand elle vaut une certaine valeur, j'effectue mon action ... et je recommence ainsi de suite ...

    Voici d'ailleur le code pour illustrer la chose
    (il y a des appelles a des fonctions que j'ai réalisé, step est une variable globale qui est changée dans la fonction appellée si tout c'est bien passé)
    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
    51
    52
    53
    54
    55
    56
    57
     
    __declspec(dllexport) int LAfonction(short stop, statMeasRead *cluster1, unsigned short paramLv[]){
     
      // Test fermeture du programme
      if(stop == 1){
        step = 3;
      }
     
      // Step = 0 -> Initialisation + connection.
      if(step == 0){
        connection();
      }
     
      // Step = 1 -> Recuperer tout les parametres.
      if(step == 1){
     
        sending(2, cpt, 0);
        receive(cluster1, paramLv);
     
        // Compteur de passage dans initialisation
        cpt++;
     
        // Initialisation terminee
        if(cpt == NBPARAM){
          memcpy((void *)paramOld, (const void*)paramLv, NBPARAM*sizeof(unsigned short));
          step = 2;
        }
      }
     
      //Step = 2 -> Envoyer et recevoir des données normalement.
      if(step == 2){
     
        // Boucle pour voir si le tableau des parametres a été modifié.
        for(cpt = 0; cpt < NBPARAM; cpt++){
          if(paramLv[cpt] != paramOld[cpt]){
            sending(3, cpt, paramLv[cpt]);
            receive(cluster1, paramLv);
            paramOld[cpt] = paramLv[cpt];
            break;
          }
        }
     
        // Status and Measures reading (TCS request)
        cptReqStat++;
        if(cptReqStat == 10000){
          sending(1,0,0);
          receive(cluster1, paramLv);
          cptReqStat = 0;
        }
      }
     
      //Step = 3 -> Deconnection.
      if(step == 3){
        disconnection();
        return 1;
      }         
    }
    et la partie plus précisement dont je vous parlais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        cptReqStat++;
        if(cptReqStat == 10000){
          sending(1,0,0);
          receive(cluster1, paramLv);
          cptReqStat = 0;
        }
    Maintenant cette solution n'est pas très précise ...

    Comment pourrais je faire pour utiliser plutot un style de timer ? Histoire d'avori quelque chose de plus propre et de plus précis ?


    Merci d'avance

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Pour une application graphique sous Windows, j'aurait utilisé un bète timer (SetTimer(), WM_TIMER). Mais j'ignore s'il existe un équivalent sous LabView...

    En tout cas, je pense qu'il ne devrait pas y avoir besoin de multithread pour ça.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 302
    Par défaut
    Bah la dll est independante de labview ...

    Le code serait interne a la dll ...

    LabView ne sert qu'a afficher ce que je recois

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Si tu peux ouvrir des fenêtres Win32 dans ta DLL (sachant que si j'ai bien compris, celle-ci n'a aucun contrôle sur la boucle de messages, et c'est LabView qui contrôle), alors tu peux utiliser un timer depuis la DLL elle-même.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 302
    Par défaut
    Bah le probleme, c'est que ca doit etre portable sous linux ... Donc je sais pas si ouvrir des fenetres win32 c'est très portable ...

    Enfaite c'est la dll qui fait tout ... (c''est une dll qui s'occuper d'envoyer et recevoir des messages par TCP/IP) ... LabView n'est la que pour recuperer les valeurs recues a la sortie de la dll pour les afficher

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Je ne connais rien de portable pour faire un truc toutes les X secondes sans bloquer complètement le thread courant.

    Si bloquer le thread courant est acceptable, une simple boucle avec des appels à Sleep()/usleep() suffit...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. Effectuer une action toutes les n secondes
    Par zwoke dans le forum Débuter avec Java
    Réponses: 8
    Dernier message: 17/08/2008, 05h40
  2. [Ruby] Executer une methode toutes les x secondes
    Par skystef dans le forum GTK+
    Réponses: 4
    Dernier message: 29/11/2007, 20h49
  3. Executer une fonction tout les X minutes
    Par Fabouney dans le forum C
    Réponses: 6
    Dernier message: 07/08/2006, 19h33
  4. Appel d'une procedure toute les S secondes
    Par thierrybatlle dans le forum Composants VCL
    Réponses: 3
    Dernier message: 01/02/2006, 13h46
  5. [Javascript] Réactualisez une page toutes les X secondes...
    Par funktastique dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 20/01/2006, 15h52

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