2015-04-09 1 views
-1

J'essaie d'avoir à autre fenêtre dans un contexte différent rassasiement, je veux dire, chaque fenêtre a son propre rappel pour l'affichage, ralenti ...Glut, contexte différent dans différents fil C++

J'ai quelques-uns problèmes sur rassasiement:

Première tentative:

glutInit au début du programme, fil après -> Quand je ferme une fenêtre, une erreur est survenue:

freeglut ERROR: Internal <Event Handler> function called without first calling 'glutInit'. 

Deuxième tentative:

glutInit dans chaque thread: Lorsque le second fil est lauched:

freeglut illegal glutInit() reinitialization attempt 
+0

'DIFFERENTS fenêtre GLUT en différentes context' -> Je ne comprends pas ce que cela signifie réellement. Expliquez clairement quel est le design. Combien de threads avez-vous? Combien de fenêtres? Combien de thread appelle réellement les routines OpenGL? –

+0

J'ai 2 fils (en plus du fil principal). Chacun représente un contexte: A windows, callbacks, et glutMainLoop() – Epitouille

+1

AFAIK, GLUT et plusieurs threads ne vont pas ensemble. Voir par exemple la [documentation de 'glutMainLoop'] (https://www.opengl.org/resources/libraries/glut/spec3/node14.html#SECTION00041000000000000000):" Cette routine devrait être appelée au plus une fois dans un programme GLUT. " Vous pourriez avoir plus de chance avec une bibliothèque plus moderne comme GLFW. – molbdnilo

Répondre

3

GLUT n'a pas été conçu en toute sécurité de fil à l'esprit (ou même plusieurs threads en charge du tout). Alors j'ai peur, qu'avec GLUT tu ne pourras pas réaliser ce que tu veux. Cependant, GLFW semble être beaucoup mieux dans ce domaine:

Discussion sécurité

La plupart des fonctions glfw ne peuvent être appelées à partir du fil conducteur, mais certains peuvent être appelés de tout fil. Cependant, aucune fonction GLFW ne peut être appelée à partir de tout autre thread jusqu'à ce que GLFW ait été initialisé avec succès sur le thread principal, y compris les fonctions qui peuvent être appelées avant l'initialisation .

La documentation de référence pour chaque fonction GLFW indique si est limitée au thread principal.

Les catégories suivantes de fonctions sont et resteront limitées à le thread principal en raison des limites d'une ou plusieurs plates-formes:

  • Initialisation et terminaison
  • Traitement des événements
  • Création et destruction de Objets de fenêtre, de contexte et de curseur

Cette partie semble assez important dans votre cas:

Le rendu peut être effectué sur n'importe quel thread.Le contexte suivant lié fonctions peuvent être appelées de tout fil:

  • glfwMakeContextCurrent
  • glfwGetCurrentContext
  • glfwSwapBuffers
  • glfwSwapInterval
  • glfwExtensionSupported
  • glfwGetProcAddress

[...]

GLFW n'utilise aucun objet de synchronisation en interne, à l'exception du stockage local-thread pour garder une trace du contexte en cours pour chaque thread . La synchronisation est laissée à l'application.

Source: GLFW Doc - Thread Safety