2009-02-24 14 views
19

¡Saludos!Mac OS X: ¿Se puede procesar un procesamiento en la ventana de otro proceso?

Actualmente estoy transfiriendo un complemento de navegador web de Win32 a MacOSX. Una de las características del complemento es que cuando se carga el complemento, genera un proceso separado que sirve como el "motor" del complemento y ejecuta operaciones de dibujo en la ventana del complemento (específicamente, al asociar un contexto OpenGL al la ventana del proceso principal y la ejecución de comandos de representación de OpenGL en ese contexto). Hacemos esto porque el complemento generalmente se carga como un hilo dentro del proceso del navegador, por lo que los bloqueos en el complemento eliminarán todo el navegador. Al dividir el 'trabajo pesado' en un proceso separado y mantener el código del complemento muy reducido, podemos proteger a los usuarios contra dichos bloqueos.

Me gustaría preservar esta arquitectura de procesador de procesos secundarios en MacOSX, pero he escuchado un rumor desagradable (relacionado con el navegador web Google Chrome) de que MacOSX no permite que un proceso acceda manualmente a su ventanas a otro proceso. Mi propia búsqueda en este espacio no ha sido concluyente; si alguien tiene algún conocimiento de este problema y podría proporcionar algún consejo sobre cómo lograr esta meta o un "no se puede hacer" más concluyente, sería extremadamente útil.

¡Gracias por tu ayuda!

+0

Esto podría ser de interés para usted. http://developer.apple.com/DOCUMENTATION/CoreFoundation/Conceptual/CFPlugIns/CFPlugIns.html – Jonathan

+2

Eso realmente no tiene nada que ver con nada del cartel original. –

+0

hola - ¿dónde está la documentación sobre esto para win32? Me gustaría aprender los límites de la propiedad de ventanas multiproceso. – drudru

Respuesta

9

Estaba investigando una solución para esto hace casi un año. Empecé a unos pocos hilos en las listas de correo de manzana:

http://www.mail-archive.com/[email protected]/msg08056.html

http: // www. mail-archive.com/[email protected]/msg01878.html

http://lists.apple.com/archives/mac-opengl/2008/May/msg00099.html

Tuve que volver a una solución que utilizaba CGWindowListCreateImage, que tomaba una captura de pantalla de la ventana de proceso de OpenGL y la convertía en un mapa de bits para visualizar en la ventana principal del proceso. Esto está lejos de ser eficaz ya que los datos de píxel se transfieren desde el ram de video al ram del sistema.

También probé una solución de ventana flotante. La ventana de proceso de OpenGL flotaba sobre la ventana principal del proceso y respondía a los movimientos del mouse desde la ventana principal. Pero tuve problemas con el arrastre de lag y el orden de la ventana z.

Usted pensaría que NSWindowSharingReadWrite haría lo que necesita, pero la documentación/ejemplos en ese momento eran prácticamente inexistentes.

Pero tal vez las cosas han cambiado en el último año. ¡Mantenme informado si encuentras algo nuevo!

Buena suerte

JC

+0

Después de investigar este problema durante aproximadamente una semana, obtuve más o menos aquí. Tengo solicitudes pendientes para Apple sobre el tema, pero nadie me ha contactado cómo aprovechar una ventana con NSWindowSharingType establecido en NSWindowSharingReadWrite. A partir de Mac OS 10.5, tendré que llamar a escritura-a-ventanas ya sea "inexistente" o "demasiado poco documentada para que me importe". La solución que utilicé fue crear un buffer de memoria compartido con shm_open y mmap, glReadPixels en el del proceso A, y luego glTexImage2D y renderizar en un quad en el proceso B. Es lo suficientemente rápido. – fixermark

+0

También probé el enfoque donde la ventana de proceso de opengl flota sobre el proceso principal. Para ocuparse de los espacios, debe utilizar una API privada que le proporcione notificaciones cuando el usuario cambie de pantalla o utilice exposiciones. La peor parte es lidiar con clics, que hace que la posición z de la ventana principal vaya delante de la ventana de OpenGL, pero encontré una función privada en [NSWindow sendEvent] que lo resolvió parcialmente. Esto es feo y estoy buscando una mejor solución también. – neoneye

3

Una ventana en un proceso puede ser escrita por otro proceso, aparentemente si el NSWindowSharingType está configurado en NSWindowSharingReadWrite. Eso fue agregado en Leopard. Tenga en cuenta que no he usado esto por mí mismo, pero diría que al menos elimina el obstáculo "no se puede hacer" ;-)

5

Aquí está la respuesta global recibida del equipo de desarrollo de Apple.

En esencia, no hay forma de hacerlo en MacOSX 10.5 y versiones anteriores que sea tan limpio como asociar un contexto de representación de OpenGL a la ventana de otro proceso. Los hacks que la gente ha desarrollado pueden ser las mejores soluciones en esos casos.

Lo más parecido que tenemos en MacOS 10.6 es the IOSurface system; usar eso en 10.6 parece ser la solución más limpia. Si desea que los clics en el proceso renderizado sean interceptados por el proceso de representación, tendrá que agrupar los eventos y pasarlos al proceso de representación utilizando el método que considere más apropiado.

Más información sobre IOSurface se podía encontrar en this StackOverflow entry

Cuestiones relacionadas