2012-12-09 4 views
1

NPAPI 플러그인을 개발 중이며 브라우저의 기본 스레드에서 일부 코드를 실행해야합니다.NPAPI 플러그인의 브라우저 주 스레드

NPAPI 플러그인의 스레딩 모델은 무엇입니까? NPAPI가 실행되는 기본 스레드는 무엇입니까? 브라우저의 메인 스레드에서 코드를 실행하려면 어떻게해야합니까?

답변

2

스레딩 모델은 브라우저가 기본 스레드에서 플러그인을 호출하기 때문에 주 스레드에서 NPN_* 메쏘드로 호출해야합니다.

+0

와우; 나는 아래의 모든 일을했으며 명확한 설명을 제공하는 +1도하지 못했습니다. 거친. – taxilian

4

smorgan이 말했듯이 브라우저의 스레딩 모델은 브라우저에 대한 모든 호출이 주 스레드에서 발생해야한다는 것입니다. 하나 또는 두 개의 이상한 예외가 있지만 지원이 다소 일치하지 않습니다.

NPN_PluginThreadAsyncCall이이 문제를 정확하게 해결하기 위해 도입되었습니다. 함수 포인터를 void *로 받아 들여서 데이터로 넘겨 주며 그 함수를 주 스레드에서 호출합니다. 물론 고유 한 경쟁 조건으로 인해 플러그인 종료 중에 NPN_PluginThreadAsyncCall을 호출하면 함수가 호출 될 것이라고 보장 할 수 없기 때문에 여기서 까다로운 작업이 진행됩니다. FireBreath이 일을 처리하고 메모리 누수를 방지하기 위해 상당히 이국적인 부두가 있습니다.

FireFox 이외의 다른 브라우저를 지원하기 시작할 때 상황이 조금 더 두껍습니다. AFAIK FireFox는 모든 버전에서이 API 호출을 지원하지만 Safari의 일부 버전 (특히 64 비트)은 NPN_PluginThreadAsyncCall을 지원하지 않습니다. 가장 흥미롭게도 때로는 그것들을 지원하는 것처럼 보이지만, 당신이 그것을 사용하려고 할 때 충돌하는 잘못된 함수 포인터로 끝나게됩니다. 이것은 매우 최근 버전에서 수정되었을 가능성이 있습니다. 우리가 오래 전에 Mac에서 NSTimer를 사용하기로 변경했기 때문에 정확하게 지원되는지 여부를 감지 할 수없는 문제를 피할 수 있었기 때문에 모릅니다. 또한 Windows의 Opera는이 기능을 지원하지 않는 것으로 알려져 있습니다. FireBreath는 HWND 메시지를 사용하고 PostMessage를 지원하지 않는 Windows 브라우저의 주 스레드에서 호출을 수행합니다.

리눅스에 비슷한 문제가 있는지 알 수 없습니다. 어떤 플랫폼에 대해 염려하지 않았습니까? 나는 리눅스에 관한 어떤 이슈들도 들어 보지 못했지만, 그것은 의미가있을 수도 있고 그렇지 않을 수도있다.

다른 질문 가치가 주제에 대한 읽기 : Generating async Javascript events from browser plugin (NPAPI) How to callback plugin thread on Safari 5.1 on OSX?

행운