pluginthreadasynccall зависает браузер

#npapi

#npapi

Вопрос:

Мне нужно вызвать функцию javascript из моего плагина. Для этого я создал поток, используя npnfuncs-> pluginthreadasynccall(savedinstance, wcfEventForwarder, NULL). Внутри функции потока wcfEventForwarder я жду сообщений (в сообщении POSIX Q), которые публикуются другой библиотекой. Я намерен получать эти сообщения, а затем передавать данные (полученные в этих сообщениях) в Javascript. Проблема в том, что когда я запускаю поток с помощью pluginthreadasynccall(…) из Invoke, браузер зависает, и я больше не могу взаимодействовать с браузером. Не могли бы вы помочь мне с решением?

С уважением, Сувик

Комментарии:

1. вы добавили одни и те же комментарии к двум разным ответам; вы указали, что решили свою проблему. Я вижу, что вы новичок в stackoverflow, убедитесь, что вы не забыли проголосовать за все, что было полезным, и отметить ответ

Ответ №1:

Вы совершенно неправильно поняли цель NPN_PluginThreadAsyncCall; это не для запуска нового потока, а для запуска чего-либо в основном потоке. Ваша функция wcfEventForwarder будет вызываться в основном потоке, поэтому, если вы затем заблокируете ее, это приведет к зависанию всего плагина.

цель этого вызова функции — предоставить вам способ вызвать обратный вызов в основном потоке, поскольку, кроме NPN_PluginThreadAsyncCall, никакие функции NPN не могут быть вызваны в других потоках. Если вы хотите создать другой поток, вы должны сделать это самостоятельно, используя что-то вроде boost::thread или напрямую API потоков (выберите свой вкус).

Вы также должны отметить, что некоторые из новых браузеров, по-видимому, перестали поддерживать NPN_PluginThreadAsyncCall; в частности, похоже, что он не работает в Safari 5.1 на Windows или Mac, и у меня были проблемы с ним в нескольких других браузерах (firefox и chrome) в определенных конфигурациях на Mac.

Комментарии:

1. Хорошо, я понимаю вашу точку зрения. Большое спасибо за разъяснения. Теперь, что я сделал, так это то, что я создал поток, используя библиотеку pthread, и из тела потока я вызываю — npnfuncs->pluginthreadasynccall(savedinstance,wcfEventForwarder,NULL); Если я правильно понял, это должно выполняться в контексте вновь созданного потока и не должно замораживать мойбраузер. Но даже после этого я замечаю ту же проблему. Я использую firefox 3.6.22. Я что-то здесь упускаю?

2. Извините, пожалуйста, проигнорируйте мой предыдущий пост. Это было глупо с моей стороны. Теперь я могу запустить его. Я переместил ожидание в pthread и вызываю pluginthreadasynccall(…), чтобы отправить информацию обратно в браузер. Большое спасибо за ваши предложения.

3. на вашем месте я бы серьезно подумал об использовании FireBreath ( firebreath.org ) для вашего плагина; он решает практически все это для вас, а также обрабатывает множество сложных пограничных ситуаций на разных платформах.

Ответ №2:

Вы вызываете NPN_PluginThreadAsyncCall из другого потока или внутри «подключаемого потока»?

Комментарии:

1. Хорошо, я понимаю вашу точку зрения. Большое спасибо за разъяснения. Теперь, что я сделал, так это то, что я создал поток, используя библиотеку pthread, и из тела потока я вызываю — npnfuncs->pluginthreadasynccall(savedinstance,wcfEventForwarder,NULL); Если я правильно понял, это должно выполняться в контексте вновь созданного потока и не должно замораживать мойбраузер. Но даже после этого я замечаю ту же проблему. Я использую firefox 3.6.22. Я что-то здесь упускаю?

2. Извините, пожалуйста, проигнорируйте мой предыдущий пост. Это было глупо с моей стороны. Теперь я могу запустить его. Я переместил ожидание в pthread и вызываю pluginthreadasynccall(…), чтобы отправить информацию обратно в браузер. Большое спасибо за ваши предложения.