2012-12-12 34 views
0

下面的代码崩溃,我的插件:为什么从NPAPI插件Safari浏览器崩溃时调用NSOpenPanel?

NSOpenPanel *openFileDig = [NSOpenPanel openPanel];  
[openFileDig setCanChooseFiles:true];  
[openFileDig setCanChooseDirectories:false];  
[openFileDig setAllowsMultipleSelection:false];  
[openFileDig setDirectory:NSHomeDirectory()];  
if ([openFileDig runModal] == NSOKButton) 
{  
    .........  
} 

没有做任何事情,在3分钟左右,而openFileDig运行时,插件就会消失。有人能告诉我为什么吗?

+2

那么你为什么不向我们展示崩溃日志*,一个? –

+0

没有崩溃日志可以显示,插件消失,并没有打印在控制台中。 – Magical

回答

2

你在NPAPI调用中阻塞主线程 - 这几乎是NPAPI no-no#1。

从不有史以来在NPAPI调用期间阻塞主线程。如果您需要做一些需要一段时间并需要回拨的内容,则应该异步执行,然后将回调调回为JavaScript。 (一个传入你的npapi函数的js函数将会是一个NPObject,你可以调用NPN_InvokeDefault来调用)

由于你的runModal需要在主线程上运行,所以你需要使用像performSelectorOnMainThread这样的函数来调用函数那会调用它,然后在完成时调用你的js回调函数。另外请记住,所有NPAPI调用必须在主线程上发生,并且您应该很好。

会发生什么情况是,您的插件阻止,因此浏览器在长时间没有从插件回听后会认为它崩溃并将其杀死。

+0

Thanks.Once再** ** taxilian的**建议帮助我。我猜插件不能阻止safari主线程,但我不知道** performSelectorOnMainThread **是解决方案。顺便说一下,在safari 5.0.3和mac osx 10.6.8,插件可以阻塞主线程。 – Magical

+0

您绝对不允许在主线程中阻塞,只是某些浏览器的版本比其他版本更强大。 – taxilian