2013-11-25 40 views
1

我已經編寫了一個無窗口NPAPI插件,並且我將在一個名爲by的插件函數中執行一些持久的操作(例如,發送帶有圖像數據的http post請求)網頁瀏覽器JavaScript。在NPAPI插件被銷燬之前等待工作線程完成

爲了防止Web瀏覽器掛起,我爲每個冗長的操作創建一個工作線程。

我的問題是,如果在仍然有工作線程運行的情況下關閉瀏覽器, 如何防止我的插件實例在工作線程完成之前被銷燬(在NPP_Destroy中?)?

對於ActiveX控件,每次啓動/完成工作線程時,我都會簡單地添加/釋放插件實例的引用計數。但對於NPAPI插件,引用計數僅用於NPObject(通過NPN_CreateObject創建),而不是插件實例本身。現在我感到困惑。

任何幫助將非常感激。

回答

2

你不能。我想你可以啓動另一個進程並執行其中的操作;這樣,當插件關閉時,您可以向它發送一個信號,並說「當你準備好時,你需要關閉,但不要關閉」直到它完成。

插件本身 - 即使在IE中 - 你無法控制它什麼時候關閉,因爲如果瀏覽器關閉,它將會關閉所有插件。

歡迎來到插件的土地 - 你無法控制生命週期。

+0

我剛來M插件今年的土地:)。 「在IE中,你無法控制什麼時候關閉,因爲如果瀏覽器關閉,它會在那個時候關閉所有插件」但是在IE中,我可以使用AddRef()/ Release()來控制我的生命週期插件實例,事實上插件本身不會被銷燬,直到工作線程將插件的引用計數減少爲0.當瀏覽器關閉時,它只會將插件的引用計數減少1,並且插件不會被銷燬當工作線程提前啓動時,我將ref count加1(我運行調試模式來驗證這一點)。 – winhow

+0

糾正我,如果我錯了。我認爲NPAPI插件對於長時間運行的工作線程應該很常見。那麼,如果瀏覽器在工作線程剛剛開始工作時立即關閉,該怎麼辦?如果插件實例被銷燬,則工作線程中很容易發生訪問衝突,因爲插件的成員數據現在無效。如果另一個進程是處理這種情況的唯一方法,那麼這是否意味着我必須在另一個進程中啓動所有工作線程(以防止提及的訪問衝突)?對我來說,這似乎不是那麼常見...... – winhow

+1

由於使用COM架構,IE的情況稍有不同。每個其他瀏覽器都會在子進程中啓動插件(或以前在他們自己的進程中),並且不允許您控制生命週期。長時間運行的工作線程應該有定期的中斷點,您可以取消它們,即使在外掛程序生命週期之外:用戶可能想要關閉應用程序,系統正在關閉,... –