2009-02-16 9 views
2

J'ai créé un objet XPCOM en C++ pour une extension FireFox. J'utilise un thread de travail pour écouter un événement et quand cela arrive, j'ai besoin de faire des choses sur le thread principal. Évidemment, je ne peux pas m'asseoir et attendre en JavaScript sur le fil principal parce que vous devez pouvoir employer le navigateur (mon événement se produit très rarement). J'ai essayé de le faire dans le thread (xpcom guy envoie javascript un événement): window.setTimeout (myImportantWorkFunction, 100);Comment communiquer entre threads en JavaScript?

Cela fonctionne (sur le thread principal, comme prévu), mais il va s'arrêter indéfiniment; cela n'arrive pas après 100ms comme prévu. Vous devez cliquer autour d'un peu ou redimensionner la fenêtre et soudainement la fonction est appelée. Comme JavaScript s'est réveillé soudainement. Je suppose que c'est parce que ça se passe dans un fil.

Y a-t-il une meilleure façon pour le travailleur de demander au thread principal de faire quelque chose?

Répondre

0

JavaScript n'a qu'un fil conducteur. Les appels de fonction bloquent toujours jusqu'à leur retour. Si vous communiquez de JS vers le navigateur (ou l'extension du navigateur dans ce cas), assurez-vous que le code de votre navigateur revient immédiatement sur le JS et rappelez-vous un rappel à invoquer lorsque votre travail est terminé (c'est ainsi que setTimeout travaux).

Je soupçonne que le "clic autour" est juste une coïncidence. Avez-vous essayé d'alerte dès que l'événement est déclenché?

+0

J'ai réalisé que j'étais en train de répondre à une question complètement différente dans ma réponse originale (depuis effacée), puis j'ai commencé à écrire une nouvelle réponse et j'ai réalisé que j'écrivais juste ce que tu disais: D: ! – olliej

+0

L'alerte ne se produira pas; Je peux attendre aussi longtemps que je le souhaite (j'ai attendu 20+ minutes) et l'alerte ne s'est pas affichée avant quelques secondes après que j'ai cliqué dans la fenêtre. Le thread a été créé dans l'extension (pthread) et il essaie d'utiliser le rappel. Si je travaille dans le rappel, crash. Donc je fais setTimeout. – Paul

0

Pour ceux qui s'en soucient, j'ai renoncé à essayer d'envoyer un message entre les threads. J'ai trouvé un moyen de compiler l'objet XPCOM avec un objectif C++ afin que je puisse utiliser leur NSDistributedNotificationCenter. Cela me permet d'obtenir mon événement sur le fil principal où javascript est heureux.

La question est toujours valide, mais je vais probablement pas prendre le temps de valider la réponse de tout le monde maintenant ...

Questions connexes