2014-06-21 32 views
2

我知道可以在主线程上运行js-ctypes,因此它使用ChromeWorker来执行异步操作。但ChromeWorker s不能使用XPCOM。关闭主线程的代码?

所以我想知道是否有办法从主线程运行其他同步的东西?

我希望用它的东西像nsIZipWriter,nsIToolkitProfileService ::锁定/ Unlock`等

回答

2

在Javascript中,只有这样,才能运行现成的主线程代码为WebWorker/ChromeWorker,这确实没有XPCOM访问权限。实际上,过去有一种方法可以从工作人员使用XPCOM,并且当它再次被移除时我最初感到不安,但现在我明白这是正确的做法:XPCOM的很多(大多数)是不是线程安全的,甚至在使用看起来像是自包含的XPCOM类的实例时也是如此,因为最终很多事情最终会将一些非线程安全服务称为它们实现的一部分。这会导致数据和/或内存损坏以及最终崩溃和数据丢失。这里的问题是它并不总是损坏内存,因为并不总是数据竞争,而是每次X代码运行时都会造成严重破坏。人们经常习惯于开发和测试他们的东西,它碰巧起作用或者至少看起来像工作,但是一旦更多的人(也就是用户)开始执行代码,崩溃开始堆积起来。

可以在C++代码中的主线程外运行代码,但它有相同的问题,大部分XPCOM不是线程安全的,因此您需要小心谨慎地运行在不同的线程中,即只访问明确标记为线程安全的东西,但即使有这样的标记,也可能存在线程安全性错误。所以,你不能在JS的另一个线程中使用XPCOM(除非有专门的组件为你做这件事,比如nsIAsyncStreamCopier),甚至在C++的另一个线程中运行XPCOM需要大量的知识,技能和时间来调试东西毕竟如果有崩溃。

如果你真的想要的话,那么诸如zip-writer之类的东西可以很容易地在JS中实现并在Worker中运行。例如。 zip格式并不是特别难以实现,特别是如果您不需要实际压缩,OS.File允许您主要方便地执行来自工作人员的文件I/O。

+0

好的,谢谢。 'nsIZipWriter'并不是什么大不了的,但我有兴趣学习如何在js中做到这一点,总有一天我会问这个问题:)我不知道我们可以在js中做这么多事情(就像那个ico转换ctypes的帮助)。我想做异步的主要事情是lockProfilePath:https://gist.github.com/yajd/9927658 - 但当然好,所以不可能吧? :( – Noitidart

+1

那么,你可以随时看看实现,看看它可以安全地使用Worker(有或没有c类型)来重新实现它。'lockProfilePath'看起来非常讨厌,特别是因为它在内部在Firefox实例中追踪到某种程度(并且您无法真正以兼容的方式重新实现它),所以我不会尝试重新实现这一点! – nmaier

+0

哈哈thx警告,这是昂贵的opoeration?像我知道很多东西都不需要做异步我怎么知道它是否会让我的电脑变慢? – Noitidart