2016-07-17 4 views
-1

브라우저 창 내에서 슬라이드 쇼로 그림을 그릴 브라우저 플러그인을 만들고 있지만, 작성한 플러그인은 첫 번째 플러그인 인스턴스에만 그립니다. 플러그인의 여러 인스턴스를 열면 각 그림과 겹치는 첫 번째 플러그인 창에 그림이 계속 표시됩니다.FireBreath 플러그인이 모든 플러그인 인스턴스에 그려지지 않습니다.

URL에서 그림을 그릴 때 OpenGL을 사용하고 있습니다. 다음은

실 사용 루프 더미의 OpenGL tringles 무 부호이다

FB PluginWindowWin :: = * pluginWindowWin dynamic_cast는 (pluginWindow)를;

EnableOpenGL(pluginWindowWin->getHWND(), &hDC, &hRC); 
SetFocus(pluginWindowWin->getHWND()); 
//FB:: 
static int fps = 1; 
GLfloat rotate = 0; 
static double start = 0, diff, wait; 
wait = 1/fps; 

//return 0; 
while (true) 
{ 

    //lets check for keyboard input 
    try 
    { 
     FB::Rect pos = pluginWindow->getWindowPosition(); 

     PAINTSTRUCT ps; 
     if (pluginWindowWin){ 
      hDC = BeginPaint(pluginWindowWin->getHWND(), &ps); 

      pos.right -= pos.left; 
      pos.left = 0; 
      pos.bottom -= pos.top; 
      pos.top = 0; 

      rotate += 0.1f; 

      glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
      glClear(GL_COLOR_BUFFER_BIT); 

      glPushMatrix(); 
      glRotatef(rotate, 0.0f, 1.0f, 0.0f); 
      glBegin(GL_TRIANGLES); 

      glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(0.0f, 1.0f); 
      glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(0.87f, -0.5f); 
      glColor3f(0.0f, 0.0f, 1.0f); glVertex2f(-0.87f, -0.5f); 
      glEnd(); 

      glBegin(GL_QUADS);            // Draw A Quad 
      glColor3f(1.0f, 0.0f, 0.0f); glVertex3f(-0.5f, 0.5f, 0.0f);       // Top Left 
      glColor3f(0.0f, 1.0f, 0.0f); glVertex3f(0.5f, 0.5f, 0.0f);       // Top Right 
      glColor3f(0.0f, 0.0f, 1.0f); glVertex3f(0.5f, -0.5f, 0.0f);       // Bottom Right 
      glColor3f(0.0f, 0.0f, 0.0f); glVertex3f(-0.5f, -0.5f, 0.0f);       // Bottom Left 
      glEnd();              // Done Drawing The Quad 
      glPopMatrix(); 
      glRotatef(rotate, 0.0f, 1.0f, 0.0f); 


      SwapBuffers(hDC); 
     } 
     //rtri+=0.1f; 
     ::SetTextAlign(hDC, TA_CENTER | TA_BASELINE); 
     LPCTSTR pszText = _T("FireBreath Plugin!\n:-)"); 

     ::TextOut(hDC, pos.left + (pos.right - pos.left)/2, pos.top + (pos.bottom - pos.top)/2, pszText, lstrlen(pszText)); 

     if (pluginWindowWin) { 
      // Release the device context 
      EndPaint(pluginWindowWin->getHWND(), &ps); 
     } 
    } 
    catch (...) 
    { 
     return 0; 
    } 



    Sleep(10); 


}//end of while run 

내가 잘못하고있는 것은 무엇입니까?

+0

당신은이 중에서 어떤 브라우저가 해당됩니까? 창 모드 또는 창없는 모드입니까? (나는 창을 쳤다 고 추측하지만 그렇지 않다면 큰 문제이다). 플러그인의 각 인스턴스에 대한 스레드의 새 인스턴스를 시작 하시겠습니까? 각 스레드는 자체 hwnd 인스턴스를 포함하여 자체 데이터를 가지고 있습니까? SetFocus 호출이 처음부터 한 번만 호출되고 각 창마다 다시 호출되지 않는다는 것을 알고 있습니까? 즉, 마지막 호출 만 여전히 포커스를 가질 것입니다. – taxilian

+0

이것은 파이어 폭스와 IE에서 발생하며 창 모드만을 사용하고 있습니다. 또한 각 플러그인 인스턴스에는 자체 스레드와 데이터가 있습니다. SetFocus에 대하여 나는 OpenGL 예제 플러그인에서 그 코드를 사용하여 원래의 구현과 직면했던 문제를 복제했습니다. SetFocus를 제거해도 출력에는 아무런 차이가 없었습니다. –

+0

hDC와 hRC의 정의를 추가 할 수 있습니까? 나는 그것들이 공유되지 않았다고 가정합니까? – taxilian

답변

1

의견에서 나에게 이야기 한 내용에서 가장 중요한 문제는 결함있는 예부터 시작한다는 것입니다. 플러그인의 모든 인스턴스는 동일한 프로세스에서 시작된다는 점을 기억하십시오. 사용중인 예제는 플러그인에 대한 우수 사례를 사용하지 않는 단순한 예제입니다. 가장 구체적으로 여러 글로벌 변수를 사용합니다.

그 외에도 스레딩하고 있지만 자물쇠를 사용하여 완전히 스레드 세이프하지 않은 것으로 보입니다. 당신은 다른 누군가의 과정에 살고, 당신은 그것을 소유하지 않습니다 - 브라우저는 않습니다. 많은 일에 매우 조심해야합니다.

크래시가 정상적으로 종료되지 않았거나 스레딩 코드에서 경쟁 조건이 발생했을 가능성이 큽니다. 문제를 해결하는 가장 좋은 방법은 디버거를 연결하고 "왜 왜?"라는 질문을 던지기 만하면되는 곳에서 충돌을 일으키는 곳을 찾아내는 것입니다. (효과를 내기 위해 명백하게). 디버거를 부착 할 때까지 간단한 단계 만 수행하는 사람은 적지 만, 충돌을 해결하기위한 첫 단계가되어야합니다.

마지막으로, 다음과 같이 묻습니다. 6 개월 후에 사용할 수없는 기술로이 기술을 구현하고 있다는 것을 알고 있습니까? FireFox는 연말에 NPAPI에 대한 지원을 제거합니다. 액티브 X가 그보다 약간 길어지기를 기대하지만 Edge는 그것을 지원하지 않습니다.

FireBreath 2 (2.0 지점)은 Firebreath 1의 주요 변경 사항이지만 기본 메시징을 통한 Chrome을 지원하며 FireFox도 지원합니다. 많은 것이 있습니다 trying to convince MS to add native messaging support to Edge,하지만 우리는 어떻게되는지 알게 될 것입니다. 그 링크를 따라 자유롭게 투표하면 투표에 도움이 될 것입니다.

SDL 또는 SDL2 기본 메시지가 표시되지 않습니다. WebGL을 사용하고 javascript에서 dev를 수행 한 다음 원시 메시징에서 데이터를 가져와야합니다. 번갈아서 당신은 어떤 OpenGL/드로잉 물건 (어쩌면 SDL? 확실하지 않음)을 가지고 있지만 샌드 박스로되어 있고 당신이 필요로하는 네트워킹 물건을 가지고 있지 않을 수도있는 NaCL을 사용할 수 있습니다. 물론 Chrome에서만 작동합니다.

생각을위한 음식. 행운을 빕니다.

+0

의견을 보내 주셔서 감사합니다. 문제가 발생한 부분을 찾아 보겠습니다. 디버깅을 위해 필자는 디버거를 사용하여 이전에 가지고 있던 몇 가지 문제를 해결했지만 파이어 폭스에서 플러그인을 중단하면 디버거가 닫히고 충돌 보고서에 유용한 정보가 제공되지 않습니다. –

+0

그렇다면 디버거가 제대로 연결되어 있지 않습니다. 단지 참고로 – taxilian