2014-06-21 35 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