Pregunta

Imaginemos una biblioteca multiplataforma que tiene que crear sus propias ventanas sin depender de WinForms / GTK # / WPF / MonoMac / etc (esto es OpenTK en caso de que a alguien le interesa).

Este es el trato: el soporte de Windows y X11 con capacidad de Unix (o) puede trabajar con múltiples bucles de eventos, uno en cada hilo. Esto significa (a) que puede crear una ventana por hilo y tienen que trabajar de forma independiente y (b) se puede ejecutar un Windows Forms (GTK #, WPF, ... o) en la ventana de un hilo y abrir una ventana de OpenTK en una diferente, sin interferencias.

Ahora, a lo mejor de mi - ciertamente limitado - el conocimiento, carbono no soporta esto. acontecimientos sistema operativo sólo se entregan en el bucle de eventos "principal" y todas las discusiones secundarias se ejecutan en los humos (es decir, ReceiveNextEvent siempre devuelve eventLoopTimedOutErr y no encontrar ningún evento). sí OpenTK puede trabajar con esta limitación, no hay problema, pero esto plantea un problema interesante para aplicaciones que intentan mezclar OpenTK con un conjunto de herramientas diferentes (por ejemplo MonoMac) para presentar una ventana de configuración.

Dos opciones:

  • abandonar la idea como loco y no permitir la mezcla OpenTK con diferentes conjuntos de herramientas (malo).
  • elegir un hacha de guerra y hackear carbono en la sumisión (bueno).

Aquí está estabas entrar: se puede pensar en alguna manera de hacer este trabajo? Imagine el siguiente escenario:

  1. hilo # 1 (principal) se ejecuta algún código de inicialización de nuestra propia elección y genera un segundo hilo (podemos modificar esta libremente).
  2. hilo # 1 (principal) se abre una ventana nativa y se ejecuta un bucle RAËL (RunApplicationEventLoop). Se encuentra fuera de nuestro control directo, aunque todavía podemos instalar temporizadores para ejecutar nuestro código, si es necesario.
  3. hilo # 2 (secundaria) se abre una ventana con prontitud OpenTK que cuelga (sólo los eventos se entregan al hilo # 1 y ReceiveNextEvent recibe nada).

¿Es posible filtrar eventos de hilo # 1 y entregarlos a hilo # 2 según sea necesario? Podría CF alguna manera ayudar aquí? Gurús de Mac OS X, por favor ayuda!

(Programar el idioma no importa, el uso de cualquier cosa que esté familiarizado. Yo preferiría una solución a base de carbono, pero cacao también podría funcionar muy bien.)

¿Fue útil?

Solución

Al pasar los eventos de un hilo a otro debe trabajar por lo que acaba de conseguir llanura los eventos entregados. La parte pegajosa es que muchas de las API relacionadas con la interfaz de usuario, no es seguro para subprocesos, a pesar de que el núcleo de manipulación de carbono de eventos es. Todo lo que implica controles y actualización de dibujo probablemente se debe manejar de vuelta en el hilo principal. Que requeriría una gran cantidad de ida y vuelta, y puede no ser útil para tratar de hacer que funcione.

Otros consejos

Tome un vistazo a Application.AddMessageFilter y el IMessageFilter interfaz. Usted podría ser capaz de interceptar y reenviar mensajes utilizando la lógica personalizada. He utilizado esta técnica en el pasado (pasado muy lejano), pero ha sido hace tanto tiempo que no recuerdo todas las advertencias que van junto con ella. Ni siquiera estoy seguro de que el filtro de mensajes recibirá todos los mensajes. .NET no podría estar filtrando hacia fuera detrás de las escenas antes de enviarlos a la IMessageFilter, pero vale la pena un tiro.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top