Forums : XPCom

Aller à la discussion :  Plus récente Plus ancienne

Aller à la page :  1 2

# Utiliser nsCOMPtr

Envoyé par : zeyous

Date : 14/04/2007 17:32

Salut à tous

je découvre actuellement le dev C++ des composants XPCOM pour firefox et je test ce que je lis.

Avec la ligne

nsCOMPtr<nsIProxyObjectManager> manager = do_GetService(NS_XPCOMPROXY_CONTRACTID, &rv2);

J'ai un problème de compilation :

error C3861: 'do_GetService': identifier not found, even with argument-dependent lookup

alors que je fais bien dans mon composant-impl.h

#include "nsCOMPtr.h"
#include "nsIProxyObjectManager.h"

il dois me manquer quelque chose je sais pas. Je précise que la compilation de mon firefox fonctionne.

Merci de votre aide :)

# Re: Utiliser nsCOMPtr

Envoyé par : Paul Rouget

Date : 14/04/2007 20:48

     8 #include "nsComponentManagerUtils.h"
     9 #include "nsServiceManagerUtils.h"

# Re: Utiliser nsCOMPtr

Envoyé par : zeyous

Date : 15/04/2007 21:34

héhé merci ca roule :)

J'ai pas mal avancé dans mon but de faire un traitement threadé dans un composant XPCOM. Merci à xulfr pour le wiki sur le sujet c'est le seul truc clair que j'ai trouvé sur le net à ce propos o_O. La j'ai théoriquement un proxy sur un objet threadé et la méthode run se lance bien.

Après quelque tests je me pose une question : si depuis la classe de base de mon composant je lance mon thread et que celui-ci, dans sa méthode run, tombe sur une boucle infini pourquoi mon firefox freeze quand même ? logiquement le thread principal devrait pas être bloqué non ?

Thanks a lot :)

# Re: Utiliser nsCOMPtr

Envoyé par : Paul Rouget

Date : 16/04/2007 15:38

Normalement, en effet, ça ne devrait pas poser de problème.

# Re: Utiliser nsCOMPtr et thread xpcom

Envoyé par : zeyous

Date : 16/04/2007 19:38

Ok merci Paul, que pense-tu de ce code c'est correct ?

nsCOMPtr<nsIProxyObjectManager> manager = do_GetService(NS_XPCOMPROXY_CONTRACTID, &rv2);	

nsCOMPtr<nsIClasseB> maClasseB= new nsClasseB();
nsCOMPtr<nsIRunnable> maClasseBProxy;

nsCOMPtr<nsIEventQueueService> queue = do_GetService(NS_EVENTQUEUESERVICE_CONTRACTID);
nsCOMPtr<nsIEventQueue> mEventQueue;
queue->GetSpecialEventQueue((PRUint32)nsIEventQueueService::UI_THREAD_EVENT_QUEUE,
                            getter_AddRefs(mEventQueue));

manager->GetProxyForObject(mEventQueue,
                           NS_GET_IID(nsIRunnable),
		    maClasseB,PROXY_ASYNC|PROXY_ALWAYS,
		    getter_AddRefs(maClasseBProxy));

nsCOMPtr<nsIThread> thread = do_CreateInstance("@mozilla.org/thread;1");

thread->Init(maClasseBProxy,
            (PRUint32)1024,
            (PRThreadPriority)nsIThread::PRIORITY_LOW,
     (PRThreadScope)nsIThread::SCOPE_GLOBAL,
     (PRThreadState)nsIThread::STATE_UNJOINABLE);

J'ai donc une classeB qui hérite de nsIRunnable et le code ci-dessus est dans une méthode de la classeA. Cette méthode est appellée depuis le Javascript de mon extension.

Merciii

# Re: Utiliser nsCOMPtr

Envoyé par : David Marteau

Date : 25/04/2007 00:21

Oh là là, ce n'est pas le nsIRunnable qu'il faut proxifier !

Dans ton code, la méthode run() est appelée de manière asynchrone dans le thread principal !!!

# Re: Utiliser nsCOMPtr

Envoyé par : zeyous

Date : 11/05/2007 22:35

Ok merci David. J'ai avancé et j'arrive à créer mon thread. Dans une méthode Init de ma classe qui hérite de nsRunnable je fais

nsCOMPtr<nsIThread> mThread = do_CreateInstance("@mozilla.org/thread;1");
mThread->Init(NS_STATIC_CAST(nsIRunnable*, this), 
		(PRUint32)1024,
		(PRThreadPriority)nsIThread::PRIORITY_NORMAL,
		(PRThreadScope)nsIThread::SCOPE_GLOBAL,
		(PRThreadState)nsIThread::STATE_UNJOINABLE);

Immédiatmeent après ça la méthode Run se lance automatiquement comme tu l'as dit et son traitement est threadé.

Par contre je ne comprend pas bien quand est-ce que je dois utiliser des proxys. Est-ce que c'est quand je veux appeler des objets DEPUIS la méthode Run() ?

Là par exemple dans ma classe qui hérite de nsRunnable j'ai une méthode SetMainDoc( nsIDOMDocument) qui permet à ma classe de base de passer l'arbre DOM au thread pour qu'il joue avec dans la méthode Run(). Je proxyfie cet objet pour l'utiliser est-ce que c'est correct ?

Mercii à vous !

Zeyous

# Re: Utiliser nsCOMPtr

Envoyé par : David Marteau

Date : 11/05/2007 22:56

Les proxys permettent d'éxecuter une méthode d'un objet dans un autre thread que celui d'où on effectue cet appel. Donc dans ton cas tu peux appeler des methodes d'objets différents DEPUIS la méthode run à condition d'avoir récupéré un proxy sur l'interface de cet objet que tu souhaite utiliser (suis-je clair ?).

Dans ces conditions les méthodes appelés s'éxecuteront dans le contexte du thread associé a l''Event Queue' passé à GetProxyForObject(..).

En proxyfiant nsIDOMDocument, cela siginifie que toute les methodes de nsIDOMDocument s'effecturont dans le contexte du thread principale. Mais je te conseille de 1) proxyfier nsIDOMDocument, 2) de le passer à ton nsIRunnable, *puis* 3) de lancer ton thread.

Maintenant, si tu veux appeler des méthodes de ton runnable à partir du thread principale il faut créer un nsIEventQueue associé à ton thread et de proxifier ton nsIRunnable avec ce nsIEventQueue. C'est cet objet proxyfié que tu appelera depuis le thread principale.

        

# Re: Utiliser nsCOMPtr

Envoyé par : zeyous

Date : 12/05/2007 00:37

ok oui merci c'est déjà bien plus clair ;-)

Voici comment je proxifie le nsIDOMDocument

nsCOMPtr<nsIProxyObjectManager> manager = do_GetService(NS_XPCOMPROXY_CONTRACTID);

manager->GetProxyForObject(NS_CURRENT_EVENTQ,
                           NS_GET_IID(nsIDOMDocument),
                           aMainDoc,
                           PROXY_SYNC|PROXY_ALWAYS,
                           getter_AddRefs(mDocumentProxy));

En fesant ça avant de lancer le thread, cela veut donc dire que quand je fais dans le Run() des "GetChildNodes" sur le proxy, ceux-ci s'executent dans le contexte du thread principal au lieu de mon thread ? Est-ce que cela serait dangereux si ils s'executaient dans mon thread ?

# Re: Utiliser nsCOMPtr

Envoyé par : David Marteau

Date : 12/05/2007 23:10

zeyous a écrit:


En faisant ça avant de lancer le thread, cela veut
donc dire que quand je fais dans le Run() des
"GetChildNodes" sur le proxy, ceux-ci s'executent
dans le contexte du thread principal au lieu de
mon thread ?

Exactement.

Est-ce que cela serait dangereux si
ils s'executaient dans mon thread ?

Dangereux ??? Puni de mort lente et douloureuse oui !!!!

LA regle du multithread : ne jamais modifier le DOM dans un autre thread que le thread principal !

Aller à la page :  1 2

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.