首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从JavaScript通知XPcom外部事件

从JavaScript通知XPcom外部事件
EN

Stack Overflow用户
提问于 2012-01-25 02:18:01
回答 1查看 255关注 0票数 2

我一直试图找到一个解决方案,似乎是相对简单的情况。我让JavaScript运行在一个html页面中,该页面调用我用C++编写的一个XPcom。到现在为止还好。

此XPcom检索对观察者-服务(do_GetService("@mozilla.org/observer-service;1"))的引用;发出被JavaScript“看到”的通知;XPcom创建窗口线程(AFX),传递观察者-服务引用的副本并返回给JavaScript调用者;期望XPcom线程在适当的时候(基于外部事件)发送额外的通知。

然而,通知未能到达JavaScript,我最初的想法是通知方法不会从“不同”线程传递通知。我使用VStudio调试器来确认程序序列是否与预期的一样;即线程正在接收外部事件,并且正在调用notify方法.但是,没有通知事件。

我在网上读了不少帖子,但没有任何东西真正“指指点点”我想要解决的具体情况。我不同意使用通知的想法:

  • 我尝试过通过NS_DispatchToCurrentThread进行事件通知,但是这也不起作用,因为我没有来自JavaScript端的“事件”来传递。我可以在XPcom的上下文中创建一个XPcom,我可以“通知它”;但是,这只是一个POC,以证明我可以从XPcom中传递事件;现在,我需要JavaScript端给我一个事件通知;
  • ,我尝试将一个新的‘’ed‘对象作为nsiSupports arg传递;但是,DispatchToCurrentThread想要一个nsiRunnable,而我不知道如何传递其中的一个( idl文件也没有考虑用与nsiSupports兼容的某种对象“包装”事件;但是,我不确定这样做的细节。

目标很简单。将异步事件或通知从XPcom线程传递到JavaScript的主线程,甚至子线程;但是,我在这里得到的牵引力还不到10%。是否有人做到了这一点,或对如何做到这一点有想法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-25 06:52:32

您是正确的,观察者服务只在主线程上工作(检查Notify()调用的返回值,它应该是NS_ERROR_UNEXPECTED)。就解决方案而言,您也是正确的--通过NS_DispatchToMainThread()将事件分派到主线程。至于实际的实现,函数NS_NewRunnableMethod()应该会有所帮助(除非您希望创建自定义nsIRunnable实现--例如传递参数)。你可能想做这样的事:

代码语言:javascript
复制
nsCOMPtr<nsIRunnable> event = NS_NewRunnableMethod(xpcomComponent, &nsMyComponent::processEvent);
nsresult rv = NS_DispatchToMainThread(event);

这里,xpcomComponent将是对XPCOM组件实例和需要在主线程上调用的nsMyComponent::processEvent方法的引用。这样,该方法就可以通知观察员。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8997103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档