OpenGL et Threads

FleX2009 Messages postés 22 Date d'inscription mercredi 15 décembre 2004 Statut Membre Dernière intervention 5 mai 2005 - 2 mai 2005 à 00:06
FleX2009 Messages postés 22 Date d'inscription mercredi 15 décembre 2004 Statut Membre Dernière intervention 5 mai 2005 - 5 mai 2005 à 12:58
Bonjour à tous,

voilà j'ai un petit problème : je veux dessiner en OpenGL dans un thread, mon algo est du type :



Boucle Dessin

Fin boucle // jusque ici ok

Debut Thread Dessin

Autres instructions...





Le problème c'est que rien n'est affiché et la fenetre ne réponds plus
(pourtant lorsque je fait du pas à pas, le code du thread est bien
executé, dont le swap des buffers...)



Si vous avez rien qu'un indice, je vous serai très reconnaissant. Si
vous ne comprenez pas, je me suis peut être mal exprimé, dans ce cas
n'hésitez pas à me le dire, j'essayerai de reformuler.



En tout cas, merci d'avance.

6 réponses

WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
2 mai 2005 à 01:28
Deux possibilités :
- La non synchronisation ( Rappel : "N'utilisez pas les propriétés et méthodes d'autres objets directement dans la méthode Execute d'un thread. Il faut séparer l'utilisation des autres objets dans un appel de procédure distinct et appeler cette procédure en la transmettant comme paramètre à la méthode Synchronize." )

- Le blocage de la file d'attente des événements.

Exemple de code traitant les deux possibilités :

procedure MonThread.Execute ;
begin
while true do
begin
Synchronize(MaProcedureDeDessin);
end;
end;


procedure MonThread.MaProcedureDeDessin ;
begin
// Mettre ici le code de dessin

Application .ProcessMessages ;
end ;

Cordialement.
0
FleX2009 Messages postés 22 Date d'inscription mercredi 15 décembre 2004 Statut Membre Dernière intervention 5 mai 2005
2 mai 2005 à 16:41
Merci beaucoup pour avoir répondu , mais ca me fait toujours le même problème...

Synchronize c'est uniquement lorsque les ressources doivent être partagé entre les threads, non?

C'est peut être même pire, car en mode pas à pas, le debugger ne
s'arrete même plus dans les points d'arrets des lignes de code de la
fonction de dessin.



Sinon j'utilise glfw pour la gestion des fenetres OpenGL, et glfw gère
aussi les threads, j'ai essayé avec mais encore le même problème... (et
pourtant les lignes de codes sont bien executées)



J'ai aussi essayé de mettre mon code de dessin dans le thread principal
et mes autres fonctions dans mon nouveau thread, et là ça marche impec
; le truc c'est que cela me dérange un peu.



Je ne pense pas que ça vient de glfw car même en mettant juste les
codes de dessins dans le nouveau thread et le swap des buffers dans le
thread principal, je n'obtient rien.



Si j'ai mal compri ton aide ou si y'a d'autres idées, je suis preneur
0
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
2 mai 2005 à 17:13
Fallait le dire avant que c'était avec glfw

Attention les threads utilisés par glfw ne sont pas les mêmes que ceux utilisés par Delphi. Il vaut mieux utiliser les fonctions de la librairie (Notamment: glfwCreateThread, glfwDestroyThread) pour les threads et surtout ne pas utiliser directement le TThread de Delphi.

Cordialement.
0
FleX2009 Messages postés 22 Date d'inscription mercredi 15 décembre 2004 Statut Membre Dernière intervention 5 mai 2005
2 mai 2005 à 17:54
Lol oui désolé, mais en fait au début j'avais completement zappé les threads de glfw



Le truc c'est que par exemple cela ne marche pas :



var

mafonc: GLFWthreadfunc;



begin

mafonc := dessin;

glfwcreatethread(mafonc, nil);

while true do

boucle_de_traitements; // autres fonctions

end;



// avec :

function dessin(arg; pointer); stdcall;

begin

while TRUE do

begin

glBegin(GL_LINES); // par exemple

glVertex2f(0.5,0.2);

glVertex2f(0.3,0.6);

glEnd;

glfwSwapBuffers;

end;

end;



Pourtant le code m'a l'air correct. Sinon le
contraire, c'est à dire en échangeant dessin avec boucle_de_traitement,
marche nickel (à conditions de mettre quelques sleep à
boucles_de_traitement car le thread glfw à l'air de pomper toutes les
ressources system...).



En tout cas, merci de ton aide très rapide.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
2 mai 2005 à 23:49
Ne mets pas des "sleep" (essaye plutot les caleçons ), mais rend plutot la main au systeme avec par exemple un peekmessage.

Cordialement.
0
FleX2009 Messages postés 22 Date d'inscription mercredi 15 décembre 2004 Statut Membre Dernière intervention 5 mai 2005
5 mai 2005 à 12:58
C'est bon je suis passé aux "string"



Plus sérieusement, je ne vois pas comment utiliser les peekmessage et
companie avec glfw, mais bon je vais y jeter un oeil, merci



Sinon, tu serai comment je pourrais faire pour avoir ma boucle de
dessin dans mon nouveau thread? (si tu ne sais pas, un non me suffirais
aussi lol )
0
Rejoignez-nous