Как вызвать поток плагина обратного вызова в Safari 5.1 на OSX?

Функции Gecko NPN_PluginThreadAsyncCall/pluginthreadasynccall у меня не работают в Safari 5.1 (работает Firefox) — моя функция не вызывается. Я пытаюсь сделать обратный вызов функции в JavaScript после выполнения длительной задачи в другом потоке. Как я могу заставить это работать?


person Peter Tseng    schedule 28.10.2011    source источник


Ответы (1)


Да, у нас была та же проблема с Safari 5.1 в FireBreath (на которую вам обязательно стоит обратить внимание, если вы не знакомы с этим); NPN_PluginThreadAsyncCall больше не работает. Вы не указали, на какой платформе вы работаете, поэтому я покажу вам, что мы используем как на Mac, так и на Windows.

В Windows мы создаем сообщение HWND и отправляем сообщение этому HWND, передавая void* в данных события как LPARAM; void* преобразуется обратно в указатель на структуру данных, содержащую параметры, которые обычно принимает pluginthreadasynccall, выполняется вызов, и структура данных освобождается. Используемый нами класс окна сообщения, и здесь выполняется вызов. (Обратите внимание, что мы используем тот же механизм для межпоточных вызовов в IE)

На Mac мы в основном просто используем target-c PerformSelectorOnMainThread; мы обернули его в класс, чтобы упростить его использование из C++. класс планировщика, который мы используем, находится здесь, и здесь выполняется вызов. Обратите внимание, что вам нужно быть очень осторожным, потому что с ними существует множество возможных условий гонки, и иногда вы сталкиваетесь с повторным входом в код. FireBreath потратил десятки часов на совершенствование межпоточных вызовов; это обманчиво сложная проблема.

Надеюсь, это поможет!

person taxilian    schedule 28.10.2011
comment
В очередной раз благодарим за помощь. Я закончил тем, что использовал PerformSelectorOnMainThread, который, похоже, отлично работает :) - person Peter Tseng; 01.11.2011