Envoyé par : Utilisateur anonyme
Date : 08/08/2005 15:59
Bonjour,
Je cherche a implémenter un timer en xpcom, cependant j'ai quelques problemes, notamment je n'arrive pas à creer d'instance nsITimer. Il me semble pourtant avoir retourné le web d'un bout à l'autre ;) , mais je ne trouve pas de solution :( !!! Quelqu'un sait il comment implémenter ce type de fonctionnalité, peut il donner un exemple et/ou corriger mon code svp ?
Par ailleurs ou puis je trouver les dernieres version de nsITimer.h et nsITimerCallback.h ?
Il y a t il un autre maniere d'implementer des timer en XPCOM ?
Merci d'avance pour votre aide dont j'ai grand besoin.
Ce que j'ai écrit: MyClass.h
class MyClass: public IMyClass, public nsITimerCallback { public: NS_DECL_ISUPPORTS NS_IMETHOD_(void) Notify(nsITimer *timer) = 0; MyClass(); private: ~MyClass(); protected: nsCOMPtr<nsITimer> mTimer; };
MyClass.cpp
NS_IMPL_ISUPPORTS1(MyClass, IMyClass)
MyClass::MyClass() { nsresult rv ; mTimer = do_CreateInstance("@mozilla.org/timer;1", &rv); }
MyClass::~MyClass() { /* destructor code */ mTimer->Cancel(); }
NS_IMETHODIMP ierSerial::Notify(nsITimer *timer) { return NS_OK; }
Envoyé par : laurentj
Date : 11/08/2005 14:12
Par ailleurs ou puis je trouver les dernieres version de nsITimer.h et nsITimerCallback.h ?
Alors
à part ça, on ne fait pas ça :
NS_IMETHOD_(void) Notify(nsITimer *timer) = 0;
Tu as des macros (énérées justement par xpidl dans le include de nsITimerCallBack. Ces macros sont du même styles que NS_DECL_ISUPPORTS. Ici donc tu as à ta disposition NS_DECL_ITIMERCALLBACK. Ces macros contiennent en fait les prototypes des méthodes et autres membres de l'interface en question.
Ensuite tu fais ça :
NS_IMPL_ISUPPORTS1(MyClass, IMyClass)
mais il semble que ta classe implémente 2 interfaces. Il faut donc que tu le dises :
NS_IMPL_ISUPPORTS2(MyClass, IMyClass, nsITimerCallback)
De plus, tu ne respectes pas la convention de nommage des classes et interfaces. Pour les classes, ça doit être xxYyyy et pour les interfaces xxIYyyy où xx sont des lettres qui identifient l'auteur ou la société (dans mozilla, on trouve ns pour netscape, ou moz aussi) et Yyyy le nom de la classe/interface. Pour toi donc, ça pourrait être xpsMyClass et xpsIMyClass. à noter aussi que le nom de la classe ne reprend pas forcément le nom de l'interface, surtout quand elle en implemente plusieurs.
Enfin, tu instancie ton timer dans ton constructeur. Ce n'est pas forcément une bonne idée. Car dans le constructeur, tu ne peux retourner de code erreur, donc retourner un NS_ERROR_quelquechose si ton rv n'est pas un NS_OK. En clair, en faisant comme tu fais, tu "zape" le pseudo système d'exception d'xpcom. Tu devrais plutôt avoir une méthode init pour initialiser des membres qui soient des objets XPCOM. Ou alors, blinder tout tes tests, comme par exemple :
if(mTimer) { mTimer->Cancel(); }
plutôt que mTimer->Cancel();
tout court.
Et il est fortement recommender de tester les rv et d'agir en conséquence (tu as plein de macros dont tu trouveras la liste dans xpcom/glue/nsDebug.h et xpcom/base/nsError.h)
Il n'est plus possible de poster des messages dans ce forum.
Copyright © 2003-2013 association xulfr, 2013-2016 Laurent Jouanneau - Informations légales.
Mozilla® est une marque déposée de la fondation Mozilla.
Mozilla.org™, Firefox™, Thunderbird™, Mozilla Suite™ et XUL™
sont des marques de la fondation Mozilla.