如何在 OSX 上的 Safari 5.1 上回调插件线程?

2023-12-21

Gecko 函数 NPN_PluginThreadAsyncCall / pluginthreadasynccall 在 Safari 5.1 上对我不起作用(Firefox 可以工作) - 我的函数没有被调用。我试图在另一个线程上执行长时间运行的任务后对 JavaScript 进行函数回调。我怎样才能做到这一点?


是的,我们在 Safari 5.1 中也遇到了同样的问题火息 http://www.firebreath.org(如果你不熟悉的话,你一定应该看看); NPN_PluginThreadAsyncCall 不再有效。您尚未指定您所在的平台,因此我将向您展示我们在 Mac 和 Windows 上使用的平台。

在 Windows 上,我们创建一条消息 HWND,并向该 HWND 发送一条消息,并在事件数据中传递一个 void* 作为 LPARAM; void* 被转换回指向包含pluginthreadasynccall 通常采用的参数的数据结构的指针,进行调用并释放数据结构。这我们使用的消息窗口类在这里 https://github.com/firebreath/FireBreath/blob/master/src/PluginCore/Win/WinMessageWindow.cpp, and 这是拨打电话的地方 https://github.com/firebreath/FireBreath/blob/master/src/ActiveXCore/ActiveXBrowserHost.cpp#L47。 (请注意,我们在 IE 中使用相同的跨线程调用机制)

在Mac上,我们基本上只使用objective-c的performSelectorOnMainThread;我们将它封装到一个类中,以便更容易在 C++ 中使用。这我们使用的调度程序类在这里 https://github.com/firebreath/FireBreath/blob/master/src/PluginCore/Mac/OneShotManager.mm, and 这是拨打电话的地方 https://github.com/firebreath/FireBreath/blob/master/src/NpapiCore/NpapiPluginModule_NPP.cpp#L134。请注意,您需要非常小心,因为这些可能存在很多竞争条件,有时您最终会得到可重入的代码。 FireBreath 投入了数十个小时的工作来完善跨线程调用;这是一个看似棘手的问题。

希望这有帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 OSX 上的 Safari 5.1 上回调插件线程? 的相关文章