2

我在 C++ 中为 FireFox 扩展创建了一个 XPCOM 对象。我正在使用工作线程来监听事件,当它发生时,我需要在主线程上做一些事情。显然,我不能只是坐在主线程上的 JavaScript 中等待,因为您需要能够使用浏览器(我的事件很少发生)。

我尝试在线程中执行此操作(xpcom guy 向 javascript 发送事件):

window.setTimeout( myImportantWorkFunction, 100 );

这有效(在主线程上,如预期的那样),但它会无限期地暂停。它不会按预期在 100 毫秒后发生。您必须单击一下或调整窗口大小,然后突然调用该函数。就像 JavaScript 突然醒了。我认为这是因为它发生在一个线程中。

工人有没有更好的方法让主线程做点什么?

4

3 回答 3

0

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

我怀疑“点击”只是一个巧合。您是否尝试过在事件触发后立即发出警报?

于 2009-02-16T22:19:32.613 回答
0

对于那些关心的人,我放弃了尝试在线程之间发送消息。我找到了一种用一些 Objective-C++ 编译 XPCOM 对象的方法,这样我就可以使用他们的 NSDistributedNotificationCenter。这让我可以在 javascript 满意的主线程上获取我的事件。

这个问题仍然有效,但我现在可能不会花时间验证任何人的答案......

于 2009-02-18T14:24:47.590 回答
0

你试过https://developer.mozilla.org/en/nsISupports_proxies吗?

于 2009-10-29T09:31:38.517 回答