2012-01-25 54 views
2

我一直在试图找到一个似乎是相对简单的方案的解决方案。我有一个运行在一个HTML页面中的JavaScript,可以调用我用C++编写的XPcom。到现在为止还挺好。从XPcom的外部事件通知JavaScript

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

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

我已经阅读了不少网上的帖子,没有真正指出我想要解决的特定情况。我没有结婚用通知的想法:通过NS_DispatchToCurrentThread

  • 我已经试过事件通知但不工作了或者是因为我没有从JavaScript端的“事件”提供。我可以在XPcom的环境中创建自己的一个,并且可以“通知它”。但是,那只是一个POC来证明我可以从XPcom发布活动;现在我需要JavaScript方面给我一个事件通知;
  • 我试过将一个new'ed对象作为nsiSupports arg传递;但是,DispatchToCurrentThread需要一个nsiRunnable,我不知道如何传递其中的一个(idl文件不支持);
  • 我也考虑用某种与nsiSupports兼容的对象'包装'事件;但是,我不确定这样做的细节。

其目的很简单。将来自XPcom线程的异步事件或通知传递给javascript的主要甚至子线程;但是,我在这里获得的牵引力不到10%。 有没有人完成过这个?或者对如何完成它有想法?

非常感谢。

回答

1

你是对的,观察员服务只在主线程中工作(查看你的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它需要在主线程中调用方法的引用。那个方法可以通知观察者。

+0

哇!辉煌的弗拉基米尔......那真是太棒了......谢谢你谢谢你,谢谢你...而且你也很喜欢整理我那破烂不堪的帖子。 – IRocks