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++Builder Discussion :

Creer un planificateur de tache sous builder


Sujet :

C++Builder

  1. #1
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 76
    Par défaut Creer un planificateur de tache sous builder
    Bonjour,

    Je voudrais créer une planificateur de tache pour cela j'ai imaginé une classe qui vérifie l'heure toutes les 30 secondes, et qui comporte des objets event composé d'une chaine de caractère l'heure, et d'un pointeur de fonction sur la fonction a lancé a telle heure, mais j'arrive pas a faire un template de pointeur de fonction membre ... voici mon code :
    dans le .H
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    template <class T> bool AjouterTache(AnsiString lhoraire, void( T::*levent)() );
    dans le .cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    template <class T> bool TPlanification ::  AjouterTache(AnsiString lhoraire, void( T::*levent)() )
    {
       ...
    }
    l'erreur du compilateur est : 'TPlanification::AjouterTache(AnsiString,void (struct::*)())' is not a member of 'TPlanification'

    d'apres la faq l'éditeur de lient a du mal a trouver les .cpp de template, ben meme si je met le code de la fonction dans le .H le compilateur m'affiche la meme erreur.

    ai je fait une erreur de syntaxe ? ou ne peut on pas faire de template de pointeur sur fonction membre d'une classe ? car suivant la classe employé le pointeur de fonction change de prototype :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    //pour la classe A
     void (A::* levent)() ;
    //et pour la classe B
     void (B::* levent)() ;
    donc mon code n'est pas portatif c'est pourquoi je voudrais faire un template qui change suivant la classe d'appartenance de la fonction que je veux lancé a telle heure.

    Merci d'avance.

  2. #2
    say
    say est déconnecté
    Membre Expert
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Par défaut
    suis pas au top en template...mais l'erreur semble claire et porte sur la résolution de portée :

    TPlanification :: AjouterTache
    cela suppose que AjouterTache soit une fonction membre de la classe TPlanification, ce qui ne doit pas être le cas...

  3. #3
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 76
    Par défaut
    sisi mais j'avais pas collé toute la classe :

    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
     
    class TPlanification
    {
         private :
                 TTimer *TimerPlanification ;
                 void __fastcall TimerPlanificationTimer(TObject *Sender);
                 AnsiString horaire[10] ;
                 int *ad[10] ;
                 void (*event[10]) () ;
                 int nbrevent ;
         public :
                 __fastcall  TPlanification() ;
                 __fastcall  ~TPlanification() ;
                 template <class T> bool AjouterTache(AnsiString lhoraire, void( T::*levent)() );
     
    };

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Par défaut
    Pourquoi dois-tu passer par un template?

    Moi j'aurais simplement fait appel à une fonction de classe (qui peut être différente pour chaque appel à AjouterTache), éventuellement en jouant sur une classe abstraite pour des paramètres ou des valeurs de retour, mais tu n'en as même pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class TPlanification {
      public:
        typedef void (*levent)();  // éventuellement ajouter "__closure" pour utiliser une fonction contenue dans une classe
        bool AjouterTache(AnsiString lhoraire, levent delegate);
    }
    Et tu appelles ta fonction comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class TFoo {
      public: 
        void CallBack();
    }
     
    TFoo myFoo;
    TPlanification myPlanification;
    myPlanification.AjouterTache("Hello",myFoo.CallBack);
    PS: C'est du code écrit comme ça, sans tester et donc à vérifier

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Par défaut
    J'ai craqué et j'ai fait le test. voici un code qui fonctionne:

    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
    class TPlanification {
      public:
        typedef void (__closure *levent)();
        bool AjouterTache(AnsiString lhoraire, levent delegate) {
          if (delegate) delegate();
        };
    };
     
    class TFoo {
      public:
        void CallBack() {
          ShowMessage("Hello");
        }
    };
     
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
     
      TFoo myFoo;
      TPlanification myPlanification;
      myPlanification.AjouterTache("Message",myFoo.CallBack);
     
    }

  6. #6
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 76
    Par défaut
    Je voulais passer par un template pour que n'importe quelle fonction de n'importe quelle classe de mon projet puisse avoir une tache planifié. Et le prototype d'un pointeur de fonction change selon la classe d'appartenance de la fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    //pour la classe A
     void (A::* levent)() ;
    //et pour la classe B
     void (B::* levent)() ;
    je ne connaissais pas l'instruction __closure ( je suis débutant ) mais en lisant la doc de Borland ce mot clef reglerais en effet mon probleme. Merci pour ta réponse je la code ce soir

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Par défaut
    Salut,

    Oui, dans Borland, c'est le mot-clé "__closure" qui va indiquer que la fonction (voir aussi délégué, delegate et callback) fait partie d'une classe. Le prototype est toujours le même (même liste de paramètre, même type de retour) mais le delegate peut appartenir à des classes différentes.

    Tu pourrais aussi utiliser des functors comme dans la STL.

    Dis-moi si ça fonctionne.

  8. #8
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 76
    Par défaut
    Grand merci a vous le programme fonctionne

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

Discussions similaires

  1. Petit prob avec l'OLE EXCELL sous builder
    Par vladi dans le forum C++Builder
    Réponses: 2
    Dernier message: 10/03/2005, 19h30
  2. Lire un AVI sous builder
    Par babozfr dans le forum C++Builder
    Réponses: 3
    Dernier message: 07/03/2005, 09h10
  3. gestion de semaphore sous builder
    Par buzzz dans le forum C++Builder
    Réponses: 3
    Dernier message: 13/02/2005, 12h43
  4. Bug sous builder
    Par Colinbayard dans le forum C++Builder
    Réponses: 3
    Dernier message: 12/01/2005, 09h45
  5. Y as il des fichiers temporaires sous builder
    Par Moutonstar dans le forum C++Builder
    Réponses: 2
    Dernier message: 12/12/2004, 14h24

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