Ich versuche, eine Multithread OpenGL-Anwendung mit libx11 zu erstellen - mit einem separaten Thread pro Fenster und einem Manager-Thread.
Ich habe eine Ereignisschleife im Manager-Thread:
%Vor%Dies ist eine großartige Event-Schleife für Single-Thread-Anwendungen, aber mit diesem Multithread-Setup passieren seltsame Dinge.
Wenn ich ein Fenster erstelle, muss ich die Ereigniswarteschlange deaktivieren oder GLXMakeCurrent hängt einfach - mein gesamter Thread stoppt und tut nichts.
Ich kann nicht viele Informationen über Multithread-X11-Anwendungen im Internet finden, sollte ich meine Ereignisse anders behandeln?
Es ist bekannt, dass Xlib mehrere nicht lösbare Laufzeitprobleme hat, die sich in bestimmten Zugriffssituationen manifestieren. Ich nehme an, Sie laufen genau in einer von denen.
Dies ist einer der Gründe, warum Xcb überhaupt erstellt wurde: Beheben Sie die Probleme von Xlib. GLX ist gegen Xlib spezifiziert, was bei OpenGL als Show-Stopper erscheinen mag. Es gibt jedoch ein Xlib, das Xcb umschließt und man kann das sicher verwenden, um mit GLX zu interagieren und Xcb für den Rest des Programms zu verwenden: Ссылка
Ich sehe zwei mögliche Lösungen:
Fügen Sie einen XLockDisplay
/ Mutex um XNextEvent
ein und der GLX ruft jeweils auf; Sie müssen nicht für gewöhnliches OpenGL sperren, nur die Funktionen glX...
vorangestellt.
Verwenden Sie Xcb, um Laufzeitverhalten zu erhalten, und folgen Sie den Anweisungen, die ich oben verlinkt habe, damit es mit OpenGL / GLX funktioniert.
Wie Sie sagten, sollten Sie überprüfen, ob Sie XInitThreads verwenden.
Ich konnte gute Ergebnisse erzielen, wenn ich einen Hintergrund-Thread für die Fensterzeichnungen einer Animation verwendete. Es scheint kein wirkliches Problem zu geben, wenn Sie beim Zeichnungscode bleiben.
Wenn Sie mehr als das brauchen und weil Sie Low Level LibX11 verwenden, ist es am besten, mehrere X11-Verbindungen zu öffnen und eine Verbindung pro Toplevel-Fenster zu verwenden. Ich habe das vor 10 Jahren gemacht, als ich mit der Entwicklung eines BeOS-Cross-Plattform-Toolkits gespielt habe und als alles in einem schlechteren Zustand war, als es jetzt ist.
Sie können dies sogar für die Ereignisbehandlung und untergeordnete Fenster eines Toplevels verwenden. Aber das benötigt einen sehr kniffligen Code für die XEvent-Masken.
Was machst du in deinen Render-Threads? In jedem Fall, wenn Sie eine Display * Verbindung über verschiedene Threads teilen, müssen Sie XInitThreads aufrufen.
Ich habe gute Erfahrungen mit einer Display-Verbindung pro Thread gemacht. Verwenden Sie XSelectInput, um Ereignisse in Ihrem Hauptthread abzurufen. Fenster-IDs können über verschiedene Display * -Verbindungen gemeinsam genutzt werden.
Tags und Links multithreading opengl thread-safety x11