我一直试图找到一个解决方案,似乎是相对简单的情况。我让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端给我一个事件通知;nsiSupports arg传递;但是,DispatchToCurrentThread想要一个nsiRunnable,而我不知道如何传递其中的一个( idl文件也没有考虑用与nsiSupports兼容的某种对象“包装”事件;但是,我不确定这样做的细节。目标很简单。将异步事件或通知从XPcom线程传递到JavaScript的主线程,甚至子线程;但是,我在这里得到的牵引力还不到10%。是否有人做到了这一点,或对如何做到这一点有想法?
发布于 2012-01-25 06:52:32
您是正确的,观察者服务只在主线程上工作(检查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方法的引用。这样,该方法就可以通知观察员。
https://stackoverflow.com/questions/8997103
复制相似问题