0

下面的代码使我的插件崩溃:

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

不做任何事情,大约 3 分钟后,在openFileDig运行时,插件将消失。有人能告诉我为什么吗?

4

1 回答 1

2

您在 NPAPI 调用中间阻塞了主线程——这几乎是 NPAPI no-no #1。

永远不要NPAPI 调用期间阻塞主线程。如果您需要做一些需要一段时间并需要回调的事情,您应该异步执行此操作,然后将回调触发回 javascript。(传递给您的 npapi 函数的 js 函数将是一个 NPObject,您可以调用 NPN_InvokeDefault 来调用)

由于您的 runModal 需要在主线程上运行,因此您需要使用 performSelectorOnMainThread 之类的函数来调用将调用该函数的函数,然后在完成后调用您的 js 回调。还要记住,所有 NPAPI 调用都必须在主线程上发生,你应该很好。

发生的情况是您的插件阻塞,因此浏览器在很长一段时间没有收到插件的回复后认为它崩溃并杀死它。

于 2012-12-12T05:09:59.503 回答