我在C ++中为FireFox扩展创建了一个XPCOM对象。我正在使用工作线程来监听事件,当它发生时,我需要在主线程上做一些事情。显然,我不能只是坐在主线程上等待JavaScript,因为你需要能够使用浏览器(我的事件很少发生)。
我尝试在线程中执行此操作(xpcom人发送javascript事件):
window.setTimeout( myImportantWorkFunction, 100 );
这适用(在主线程上,按预期),但它会无限期地暂停。它不会在100毫秒后发生。你必须点击一下或调整窗口大小,然后突然调用该函数。就像JavaScript突然醒来一样。我认为这是因为它发生在一个线程中。
工人有没有更好的方法让主线程做某事?
答案 0 :(得分:0)
JavaScript只有一个帖子。函数调用总是阻塞,直到它们返回。如果您正在从JS与浏览器(或本例中的浏览器扩展)进行通信,则应确保您的浏览器端代码立即返回到JS,并记住在您的工作完成时调用的回调(这是setTimeout的方式)作品)。
我怀疑“点击”只是巧合。一旦事件被触发,您是否尝试过警报?
答案 1 :(得分:0)
对于那些关心的人,我放弃了尝试在线程之间发送消息。我找到了一种用一些Objective-C ++编译XPCOM对象的方法,这样我就可以使用它们的NSDistributedNotificationCenter。这让我可以在javascript很开心的主线程上获取我的活动。
这个问题仍然有效,但我现在可能不会花时间验证任何人的答案......
答案 2 :(得分:0)