Frage

Stellen Sie sich eine plattformübergreifende Bibliothek, die ihre eigenen Fenster zu schaffen hat, ohne sich auf WinForms / GTK # / WPF / MonoMac / etc (dies ist OpenTK falls es jemanden interessiert).

Hier ist der Deal: Windows und X11-fähige Unices Unterstützung (oder kann mit der Arbeit) mehreren Ereignisschleifen, eine auf jedem Faden. Diese Mittel (a) Sie ein Fenster pro Thread erstellen und sie arbeiten unabhängig und (b) Sie können ein WinForms (oder GTK #, WPF, ...) Fenster in einem Thread und öffnen Sie ein OpenTK Fenster auf einem anderen laufen, ohne Störungen.

Nun, um das Beste aus meinem - zugegebenermaßen begrenzten - Wissen, nicht Kohlenstoff dies nicht unterstützen. OS-Ereignisse werden nur auf die „main“ Ereignisschleife und alle sekundären Threads laufen auf Dämpfe abgegeben (das heißt, ReceiveNextEvent immer eventLoopTimedOutErr zurück und findet keine Events). OpenTK selbst kann mit dieser Einschränkung umgehen, kein Problem, aber diese Posen eines interessantes Problem auf Anwendungen, die versuchen, OpenTK mit einem anderen Toolkit (z MonoMac) zu mischen, um ein Konfigurationsfenster zu präsentieren.

Zwei Optionen:

  • verlassen die Idee als verrückt und nicht zulassen Misch OpenTK mit unterschiedlichen Toolkits (sehr schlecht).
  • eine Streitaxt holen und hacken Kohlenstoff in die Unterwerfung (gut).

Hier ist wurden Sie kommen in: können Sie von jeder Art und Weise denken, diese Arbeit zu machen? Stellen Sie sich folgendes Szenario vor:

  1. Thema # 1 (main) läuft etwas Initialisierungscode unserer eigenen Wahl und laicht ein zweites Gewinde (wir diese frei ändern können).
  2. Thema # 1 (main), wird eine native Fenster und führt eine RAEL Schleife (RunApplicationEventLoop). Es geht aus unserer direkten Kontrolle, obwohl wir noch Timer installieren können unseren Code auszuführen, falls erforderlich.
  3. Gewinde # 2 (sekundär) öffnet ein Fenster OpenTK dass prompt hängt (Ereignisse werden nur geliefert # 1 und ReceiveNextEvent bekommt nichts einfädeln).

Ist es möglich, Filterereignisse aus Thread # 1 und # 2 liefern sie als notwendig einzufädeln? Könnte irgendwie hier helfen CF? Gurus von Mac OS X, bitte helfen Sie!

(Sprache Programmierung spielt keine Rolle, verwendet alles, was Sie sind vertraut mit. Ich würde es vorziehen, eine kohlenstoffbasierte Lösung, aber Cocoa würde gut funktionieren.)

War es hilfreich?

Lösung

Vorbei die Ereignisse von einem Thread zum anderen sollte so weit wie einfach nur arbeiten, um die Ereignisse immer geliefert. Der klebrige Teil ist, dass viele der UI-bezogene APIs nicht Thread-sicher sind, auch wenn der Kern Carbon-Event-Handling ist. Alles, was die Aktualisierung und Überwachung der Zeichnung beinhaltet sollte wahrscheinlich wieder auf dem Haupt-Thread behandelt werden. Das würde eine Menge erfordern Hin und her, und es kann nicht sinnvoll sein, zu versuchen, es funktioniert.

Andere Tipps

Hier finden Sie aktuelle Application.AddMessageFilter und IMessageFilter Schnittstelle. Sie könnte der Lage sein, abfangen und Weiterleiten von Nachrichten kundenspezifische Logik. Ich habe diese Technik in der Vergangenheit (sehr ferne Vergangenheit) verwendet, aber es ist schon so lange her, dass ich nicht alle der Einsprüche erinnern, die mit ihm mitgehen. Ich bin nicht einmal sicher, dass die Nachrichtenfilter alle Nachrichten empfangen werden. .NET könnte sie nicht hinter den Kulissen wird herausgefiltert werden, bevor sie an den IMessageFilter senden, aber es ist ein Versuch wert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top