Forums : XPCom

Aller à la discussion :  Plus récente Plus ancienne

# nsITimer : besoin d'AIDE !!!!!

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;
}

# Re: nsITimer : besoin d'AIDE !!!!!

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

  1. les fichiers nsITimer.h et nsITimerCallback.h n'existent pas, puisqu'ils sont générés lors du build à partir des fichiers idl correspondant. cependant, il faut bien sûr faire un include de nsITimer.h et nsITimerCallback.h
  2. tu trouveras donc les dernières versions de ces fichiers idl sur le cvs de mozilla bien sûr (tu peux naviguer dans le cvs via lxr
  3. je ne sais pas si c'est une bonne idée de récupérer la dernière version de seulement quelques fichiers, car alors cela risque de poser quelques soucis de compilation, voir d'execution, surtout pour les interfaces (si elles ont changé en cours de route, toute les classes que tu n'as pas mis à jour et qui font appel à ces interfaces modifiées ne compileront pas, ou planteront lamentablement)

à 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.