2010-11-01 22 views
0

Je programme un raytracer et utilise GLUT pour afficher le résultat. Je rends l'image en sous-blocs et après avoir rendu chaque sous-bloc je mets à jour la vue. Qu'est-ce qui se passe, c'est que je vois la progression du rendu, mais après quelques secondes, la fenêtre de rendu devient noire et la légende de la fenêtre lit "(ne répond pas)". Cependant, le processus de rendu continue à s'exécuter (à 100% de l'utilisation du processeur) et affiche le fichier progressinfo sur la sortie de la console. Une fois le rendu terminé, la fenêtre GLUT redevient normale et affiche l'image.La fenêtre GLUT devient noire "(ne répond pas)" quand la CPU est occupée

Que puis-je faire pour que la fenêtre reste active pendant le processus de rendu afin qu'elle ne noircisse pas?

Merci!

// edit: je bloque mon aparently mainthread en attendant le rendu des fils:

while(true){ 
    if(m_activeRenderThreads==0) 
     break; 
    ::WaitForSingleObject(updateEvent->m_hObject, 200); 
    notifyObservers(); //inherited from IFunctionObservable 
} 

notifyObservers() appelle:

update(){ 
    glClear(GL_COLOR_BUFFER_BIT); 
    glViewport(0,0,resX,resY); 
    glRasterPos2i(-1,-1); 
    glDrawPixels(resX, resY, GL_RGB, GL_FLOAT, renderBuffer); 
    glutSwapBuffers(); 
} 

cette dernière fonction ne fonctionne que si je l'appelle de la mainthread. l'appel à travers le renderthreads ne met pas à jour ma fenêtre

Répondre

0

Ce que vous devez faire est de mettre tout votre traitement dans un fil séparé; le thread graphique principal ne doit être utilisé que pour répondre aux événements GUI et peindre la fenêtre, mais ne doit pas effectuer de calculs intensifs. Donc ... dans un thread séparé, peindre dans un tampon, et de temps en temps, vous devriez planifier sur le thread principal de l'interface graphique pour que ce tampon soit copié dans l'interface utilisateur.

+0

c'est ce que je fais. lorsque je commence à rendre, je crée n nouveaux threads (n = nbre de cpu) et raytrace uniquement dans ces threads – Mat

+0

Comment mettre à jour le thread graphique? –

+0

Je pense que j'ai trouvé le problème. Je crée mes renderthreads en utilisant MFC. dans le thread principal j'attends ces threads dans une boucle while (voir ci-dessus) pour m'avertir qu'ils ont fini une sous-zone du rendu et pour mettre à jour la fenêtre GLUT. Je ne sais pas comment je peux mettre à jour la fenêtre GLUT avec un autre thread que le thread principal – Mat