通知来自XPcom的外部事件的JavaScript
Notifying JavaScript of external event from XPcom
我一直在努力寻找一个相对简单的场景的解决方案。我在一个html页面中运行JavaScript,该页面调用我用C++编写的XPcom。到目前为止,一切都很好。
该XPcom检索对观察者服务(do_GetService("@mozilla.org/observer-service;1")
)的引用;激发一个被JavaScript"看到"的通知;XPcom创建一个windows线程(AFX),传递观察器服务引用的副本并返回给JavaScript调用程序;期望XPcom线程在适当的时间(基于外部事件)发送额外的通知。
然而,通知无法到达JavaScript,我最初的想法是notify方法不会从"不同"线程传递通知。我已经使用VStudio调试器来确认程序序列如预期;即线程正在接收外部事件,并且正在调用notify方法。。。但是,没有通知事件到达。
我在网上读了不少帖子,但没有什么能真正"确定"我想要解决的特定场景。我不赞成使用通知:
- 我已经尝试过通过CCD_ 2进行事件通知,但这也不起作用,因为我没有";事件";从JavaScript端交付。我可以在XPcom的上下文中创建自己的一个,我可以"通知它";但是,这只是一个证明我可以从XPcom交付活动的POC;现在我需要JavaScript端给我一个事件通知
- 我尝试将一个新的对象作为
nsiSupports
arg传递;但是,DispatchToCurrentThread
想要一个nsiRunnable
,我不知道如何传递其中一个(idl文件不支持) - 我还考虑过用某种与
nsiSupports
兼容的对象"包装"事件;但是,我不确定这样做的细节
目标很简单。将异步事件或通知从XPcom线程传递到JavaScript的主线程,甚至子线程;但是,我在这里的牵引力还不到10%。有人完成了这项工作吗?或者有关于如何完成这项工作的想法吗?
您是对的,观察器服务只在主线程上工作(检查Notify()
调用的返回值,它应该是NS_ERROR_UNEXPECTED
)。就解决方案而言,您也是正确的——通过NS_DispatchToMainThread()
将事件调度到主线程。至于实际实现,函数NS_NewRunnableMethod()
应该会有所帮助(除非您想创建自定义nsIRunnable
实现,例如传递参数)。你可能想做这样的事情:
nsCOMPtr<nsIRunnable> event = NS_NewRunnableMethod(xpcomComponent, &nsMyComponent::processEvent);
nsresult rv = NS_DispatchToMainThread(event);
这里xpcomComponent
将是对XPCOM组件实例的引用,nsMyComponent::processEvent
是需要在主线程上调用的方法。这种方法将能够通知观察员。
- 使用html中的外部javascript进行数据验证
- 将变量传递给外部Javascript
- 关于引入外部javascript文件的问题&css通过https
- 有没有办法在tinymceiframe中加载一个外部javascript文件
- 如何在MVC5中ajax调用的部分视图中引用外部javascript
- HTML外部javascript加载另一个javascript
- 如何在定义js文件后为外部javascript文件设置变量
- ResolveUrl没有'我似乎不适合当链接到具有动态虚拟目录的外部javascript文件时
- 如何在小部件中添加外部javascript库和样式表
- 外部JavaScript验证不起作用
- Chrome扩展无法通过清单加载外部javascript
- 动态虚拟目录和外部 JavaScript 链接
- Web 地址虚拟目录会断开外部 JavaScript 链接,因此找不到文件
- 如何从窗体调用外部javascript方法
- 如何使用外部Javascript库(如jQuery)重命名Google闭包样式表
- 如何使用Java在WebDriver中调用外部JavaScript
- 从Haml调用外部javascript中的ruby数组
- 在选择更改时更改从外部javascript生成的flash播放器
- 缓存javascript失败,因为使用了外部javascript
- 在AngularJS中手动加载和卸载外部javascript