FleX2009
Messages postés22Date d'inscriptionmercredi 15 décembre 2004StatutMembreDernière intervention 5 mai 2005
-
2 mai 2005 à 00:06
FleX2009
Messages postés22Date d'inscriptionmercredi 15 décembre 2004StatutMembreDerniè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.
WhiteHippo
Messages postés1154Date d'inscriptionsamedi 14 août 2004StatutMembreDernière intervention 5 avril 20123 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
FleX2009
Messages postés22Date d'inscriptionmercredi 15 décembre 2004StatutMembreDerniè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
WhiteHippo
Messages postés1154Date d'inscriptionsamedi 14 août 2004StatutMembreDernière intervention 5 avril 20123 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.
FleX2009
Messages postés22Date d'inscriptionmercredi 15 décembre 2004StatutMembreDerniè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.
Vous n’avez pas trouvé la réponse que vous recherchez ?