2013-11-25 5 views
1

Я написал плагин NPAPI без окон, и я собираюсь выполнить некоторую длительную операцию (например, передать запрос на отправку по http с данными изображения) в функции плагина, вызванной веб-браузер JavaScript.Подождите, пока рабочие потоки не будут завершены до уничтожения плагина NPAPI.

Чтобы предотвратить зависание браузера, я создаю один рабочий поток для каждой длительной операции.

Мой вопрос в том, что если браузер закрыт, пока еще есть рабочие потоки, как я могу предотвратить уничтожение моего экземпляра плагина (в NPP_Destroy?) До завершения рабочих потоков?

Для управления ActiveX я просто добавляю/отпускаю счет экземпляра экземпляра плагина каждый раз, когда рабочий поток запускается/завершается. Но для плагина NPAPI счетчик ссылок предназначен только для NPObject (созданного через NPN_CreateObject) вместо самого экземпляра плагина. Теперь я озадачен.

Любая помощь была бы действительно оценена.

ответ

2

Вы не можете. Я предполагаю, что вы можете запустить другой процесс и выполнить операции в этом; таким образом, вы можете отправить сигнал, когда плагин выключится и скажет: «вам нужно закрыть, когда вы будете готовы», но не закрывайте его, пока он не закончится.

Сам плагин - даже в IE - вы не можете контролировать, когда он выключается, потому что, если браузер отключится, все равно все закрытые плагины в этой точке.

Добро пожаловать в плагиновую землю - вы не можете контролировать жизненный цикл.

+0

Я только что пришел в плагиновую землю в M arch в этом году :). «в IE вы не можете контролировать, когда он выключится, потому что если браузер отключится, все равно закроет все плагины в этой точке». Но в IE я мог использовать AddRef()/Release() для управления временем жизни моего plugin instance, и, действительно, сам плагин не будет уничтожен, пока рабочий поток не уменьшит счетчик плагина до 0. Когда браузер отключится, он уменьшит количество ссылок плагина на 1, и плагин не будет уничтожен, если Я увеличиваю количество ссылок на 1, когда рабочий поток запускается заранее (я проверил режим отладки, чтобы проверить это). – winhow

+0

Исправьте меня, если я ошибаюсь. Я думаю, что для плагинов NPAPI должно быть общим для рабочих потоков для длительных операций. Тогда что, если браузер сразу же закрывается, а рабочие потоки только начинают выполнять свои задания? Если экземпляр плагина разрушен, нарушение прав доступа может легко произойти в рабочих потоках, поскольку данные члена плагина теперь недействительны. Если другой процесс - единственный способ справиться с этой ситуацией, значит ли это, что я должен запустить все мои рабочие потоки в другом процессе (чтобы предотвратить указанное нарушение прав доступа)? Для меня это не так часто бывает. – winhow

+1

Ситуация с IE немного отличается благодаря использованию архитектуры COM. Каждый другой браузер запускает плагины в дочерних процессах (или ранее в их собственном процессе) и не позволяет вам контролировать время жизни. Длительные рабочие потоки должны иметь регулярные точки прерывания, где вы можете их отменить, даже вне жизненных циклов плагина: пользователи могут закрыть ваше приложение, система закрывается, ... –

 Смежные вопросы

  • Нет связанных вопросов^_^