2012-07-06 1 views
0

В моем плагине я создаю поток (используя pthread в моем случае) для прослушивания внешнего события. Когда происходит событие, я хочу вернуться к JavaScript. Насколько я понимаю, я могу назвать метод NPN_ * в потоке плагина. В результате мне нужно будет использовать NPN_PluginThreadAsyncCall в моем потоке, чтобы вызвать другой метод NPN_ * для связи с JavaScript. Таким образом, простой поток равенПоследовательный вызов NPN_PluginThreadAsyncCall

Проблема, с которой я столкнулся сейчас, заключается в том, что если внешнее происходит последовательно, например, 2 события с различным вводом данных, я получаю те же данные дважды в обратном вызове иногда (в половине случаев возвращаются два разных данных). Я думаю, это связано с тем, что NPN_PluginThreadAsyncCall - это асинхронный вызов, когда два последовательных события обращаются назад, NPN_PluginThreadAsyncCall вызывается дважды, данные переопределяются вторым вызовом уже до того, как обратный вызов JavaScript для первого события на самом деле происходит.

Первоначально данные события, которые я хочу вернуть, являются глобальной переменной. Но я также попытался изменить его на локальную переменную, она, похоже, не помогла. Есть ли другой способ, которым я могу сделать свой код последовательным вызовом, чтобы поговорить с JavaScript?

Я провел некоторое исследование и нашел это, How to callback plugin thread on Safari 5.1 on OSX?. Но я все еще не совсем понимаю (я работаю над Windows).

+0

* «Итак, простой поток» * ... кажется, что какой-то текст/код отсутствует? –

ответ

0

Вы можете реализовать это как mutexed std::deque, где первые вставленные данные являются первым, что вы поп.

Просто убедитесь, что вы не нажимаете и не выскакиваете одновременно (используйте мьютексы). Это то, что я использую в своем плагине :)

+0

Не требуется «deque», если требуется только FIFO, достаточно «очереди». –

+0

Привет, Gui, да, это подход, который я использовал. До сих пор я решил проблему. Я еще не знаком с C++ lib, поэтому я последовал за предложением Георга, используя std: list. К счастью, у него есть функции push_back, front и pop_front для реализации FIFO. А также поблагодарить вас за обмен опытом :) –

+0

Теперь дайте ответы на них! :-) – Gui13

3

Похоже, вы просто перезаписываете данные (в случае, когда два события происходят до того, как вызов асинхронного вызова для первого может быть обработан).

Есть два способа вы могли бы подойти к этому:

  • использовать параметр NPN_PluginThreadAsyncCalluserData передать ваши данные вокруг
  • использовать поточно-контейнер (например, std::list или queue защищен взаимной блокировкой), чтобы хранить события события (событие помещает данные, обработчик async извлекает и обрабатывает его)

Вопрос, который вы связываете, касается другой проблемы, где NPN_PluginThreadAsyncCall недоступен или не работает.

+0

Спасибо за подсказку. Я уже пробовал ваше предложение 1 (используя локальную переменную, как указано), но, похоже, это не помогло. Я рассмотрю предложение 2. Да, я знаю, что ссылка напрямую не связана. Но я надеялся, что обходной путь поможет решить мою проблему и не совсем понял решение. Я отправлю свое решение, если оно будет найдено позже. –

+0

@dino: Что именно вы имеете в виду, используя локальную переменную? Вы пытаетесь передать указатель на функцию-локальную переменную через NPN_PluginThreadAsyncCall? Это не сработает, так как оно выйдет за рамки, вам нужно будет пройти, например. динамически выделенный объект через userData. –

+0

Да, это не сработало. Я думал, что мне нужно будет освободить объект, который я создал, и интересовался погодой. NPN_PluginThreadAsyncCall создавал отдельные потоки при вызове, поэтому я попытался передать локальную переменную в NPN_PluginThreadAsyncCall в функции обратного вызова. –

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

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