2009-02-16 54 views
2

我在C++中为FireFox扩展创建了一个XPCOM对象。我使用工作线程来监听一个事件,当它发生时,我需要在主线程上做些事情。显然,我不能坐在主线程的JavaScript上等待,因为你需要能够使用浏览器(我的事件很少发生)。 我尝试在线程中执行此操作(xpcom发送javascript事件): window.setTimeout(myImportantWorkFunction,100);如何在JavaScript中的线程之间进行通信?

这可以工作(在主线程上,按照预期),但它会暂停;它不会像预期的那样在100ms后发生。你必须点击一下或调整窗口的大小,然后突然调用该函数。就像JavaScript突然醒了一样。我认为这是因为它发生在一个线程中。

有没有更好的方法让工作人员请求主线程执行某些操作?

回答

0

JavaScript只有一个线程。函数调用总是阻塞直到它们返回。如果你是从JS通信到浏览器(在这种情况下是浏览器的扩展),你应该确保你的浏览器端代码立即返回到JS,并记住一个回调,当你的工作完成时调用(这是setTimeout作品)。

我怀疑“点击”只是一个巧合。活动一结束,您是否尝试过提醒?

+0

我意识到自己实际上是在回答完一个完全不同的问题(因为删除了),然后我开始写一个新的答案,然后意识到我只是写了你所说的,但不同的是:D 转到我! – olliej 2009-02-17 01:55:40

0

对于那些关心的人,我放弃了尝试在线程间传递消息。我找到了一种使用Objective-C++编译XPCOM对象的方法,这样我就可以使用他们的NSDistributedNotificationCenter。这让我可以在JavaScript开心的主线程中获得我的事件。

的问题仍然是有效的,但我可能不会采取验证,现在任何人的答案的时候......