Question

Imaginez une bibliothèque multi-plateforme qui doit créer ses propres fenêtres sans compter sur WinForms / GTK # / WPF / Monomac / etc (ce qui est OpenTK au cas où quelqu'un est intéressé).

Voici l'affaire: le support de Windows et X11 capable Unices (ou peut fonctionner avec plusieurs boucles) d'événements, un sur chaque fil. Ce moyen (a), vous pouvez créer une fenêtre par fil et les faire travailler de façon autonome et (b) vous pouvez exécuter un WinForms (ou GTK #, WPF, ...) fenêtre sur un fil et d'ouvrir une fenêtre OpenTK sur un autre, sans interférence.

Maintenant, au mieux de ma - certes limitée - connaissances, carbone ne supporte pas. événements OS ne sont livrés à la boucle d'événement « principal » et tous les fils secondaires courent sur les fumées (qui est, ReceiveNextEvent retourne toujours eventLoopTimedOutErr et ne trouve aucun événement). OpenTK lui-même peut travailler avec cette limitation, pas de problème, mais cela pose un problème intéressant pour les applications qui tentent de mélanger OpenTK avec une boîte à outils différents (par exemple Monomac) pour présenter une fenêtre de configuration.

Deux options:

  • abandonner l'idée folle et DISALLOW mélange OpenTK avec des boîtes à outils différents (mauvais).
  • choisir une hache de bataille et pirater carbone dans la soumission (bien).

Voici été que vous intervenez: pouvez-vous penser à une façon de faire ce travail? Imaginez le scénario suivant:

  1. Enfiler # 1 (principal) exécute un code d'initialisation de notre choix et engendre un second fil (nous pouvons modifier cette librement).
  2. fil n ° 1 (principale) ouvre une fenêtre native et exécute une boucle de Raël (RunApplicationEventLoop). Il est hors de notre contrôle direct, même si nous pouvons encore installer des minuteries pour exécuter notre code, si nécessaire.
  3. Enfiler # 2 (secondaire) ouvre une fenêtre OpenTK que promptement (les événements se bloque ne sont livrés à fil # 1 et ReceiveNextEvent ne reçoit rien).

Est-il possible d'événements de filtre de fil # 1 et de les livrer à fil # 2 si nécessaire? CF pourrait aider en quelque sorte ici? Gourous de Mac OS X, s'il vous plaît aider!

(langage de programmation n'a pas d'importance, utilisez tout ce que vous connaissez. Je préfère une solution à base de carbone, mais Cocoa fonctionnera bien.)

Était-ce utile?

La solution

En passant les événements d'un fil à l'autre devrait fonctionner aussi loin que simplement obtenir simplement les événements livrés. La partie collante est que beaucoup des API liées à l'interface utilisateur sont pas thread-safe, même si le noyau de manutention carbone est l'événement. Tout ce qui implique des contrôles de mise à jour et le dessin devrait probablement être traitée en arrière sur le thread principal. Cela nécessite beaucoup de va-et-vient, et il ne peut pas être intéressant d'essayer de le faire fonctionner.

Autres conseils

Jetez un oeil à Application.AddMessageFilter et IMessageFilter interface. Vous peut être en mesure d'intercepter et transférer des messages en utilisant une logique personnalisée. Je l'ai utilisé cette technique dans le passé (passé très lointain), mais il a été si longtemps que je ne me rappelle pas toutes les mises en garde qui vont de pair avec elle. Je ne suis même pas certain que le filtre de message recevra tous les messages. .NET peut ne pas être les filtrer dans les coulisses avant de les envoyer au IMessageFilter, mais il vaut la peine un coup de feu.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top