begin process at 2012 05 30 00:23:18
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Algorithme

 > 

Maths

 > 

OpenGl bloqué par une Thread !?


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

OpenGl bloqué par une Thread !?

jeudi 19 mars 2009 à 11:15:08 | OpenGl bloqué par une Thread !?

spinzero

Membre Club

Bonjour 

J'ai une animation (win32) OpenGL à laquelle j'essaie d'intégrer de la synthese sonore avec la lib STK.(...au passage, si vous en connaissez d'autres, tournant sous windows  )

Alors, mon problème vient du fait que le rendu graphique via une fonction glut:

main.cpp :

int main()
{
...
glutReshapeFunc(ReshapeCallback_1);
glutDisplayFunc(RenderCallback_1);
...
}

...est bloqué pendant le calcul du son, lancé par une classe Attack (pouvant avoir de multiples instances):

attack.cpp:

int Attack::tick( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames,
         double streamTime, RtAudioStreamStatus status, void *dataPointer )
{
  SineWave *sine = (SineWave *) dataPointer;
  register StkFloat *samples = (StkFloat *) outputBuffer;

  for ( unsigned int i=0; i<nBufferFrames; i++ )
    *samples++ = sine->tick();

  return 1;
}
//---------------------------------------------------------
bool Attack::play()
{

   SineWave sine;

  //- Figure out how many bytes in an StkFloat and setup the RtAudio stream.
  RtAudio::StreamParameters p;
  p.deviceId = dac.getDefaultOutputDevice();
  p.nChannels = 1;//_o_->channel;
  RtAudioFormat format = ( sizeof(StkFloat) == 8 ) ? RTAUDIO_FLOAT64 : RTAUDIO_FLOAT32;

  //-The bufferFrames argument is an API-dependent buffering parameter (see RtAudio for further information).
  unsigned int bufferFrames = RT_BUFFER_SIZE;//defined in Stk.h.

//--1) OPEN STREAM
  try {

dac.openStream( &p,            //RtAudio::StreamParameters *outputParameters,
       NULL,           //RtAudio::StreamParameters *inputParameters,
       format,           // RtAudioFormat format, unsigned int sampleRate
       (unsigned int)Stk::sampleRate(), //unsigned int *bufferFrames
       &bufferFrames,       //RtAudioCallback callback, void *userData
       &Attack::tick,        //RtAudio::StreamOptions *options
       (void *)&sine
       );
}
 
  catch ( RtError &error ) {
    error.printMessage();
    goto cleanup;
  }

  sine.setFrequency( _o_->frequency );

  //--2) START STREAM
  try {
    dac.startStream();
}
  catch ( RtError &error ) {
    error.printMessage();
   goto cleanup;
}

// Block waiting here.
/*char keyhit;
  cout << "\nPlaying ... press <enter> to quit.\n";
  cin.get( keyhit );


  -> QUOI METTRE A LA PLACE (ci-dessus) ?? 

****************************************/

 cleanup:

 dac.closeStream();
 //delete dac;
 //_o_->func_killFM(_o_->id); 
}

... qui semble utiliser une thread , concept que je n'avais pas encore abordé

Je suis donc parti d'un exemple de Callback, dont une portion du code est en partie responsable du problème:

  // Block waiting here.
 char keyhit;
  cout << "\nPlaying ... press <enter> to quit.\n";
  cin.get( keyhit );

J'ai remplacé cette partie par

return 1;

... pensant que le son continuerait à jouer mais cela provoque une erreur (error.printMessage() ) -que je n'arrive pas à afficher- puisque

goto cleanup

...est aussitôt appelé !

Auriez-vous une solution 
merci


ps: On m'a suggéré de mettre un
return 1;
juste après startStream() , ou dans tick()
... ou encore de m'intéresser au concept de concurrence !??  mais je n'ai rien trouvé

 

jeudi 19 mars 2009 à 11:30:08 | Re : OpenGl bloqué par une Thread !?

Pistol_Pete

Salut
La solution est simple, il faut créer ta fenêtre open GL dans un autre thread. Pendant le calcul du son, cela ne bloquera plus l'affichage.
Regarde la fonction CreateThread()
A+

____________________________________________________________________________
Mon site internet :
  
[ Lien ]

jeudi 19 mars 2009 à 12:03:53 | Re : OpenGl bloqué par une Thread !?

spinzero

Membre Club
Super Pistol !

Merci du conseil, je regrade ça de suite ...

Une petite objection qd même, j'ai entendu dire :

"Keep all openGL code in single thread.
 The main thread - ie. the one which created the render context - is best"

que ça pourrait nuire aux peformances du programme, qu'en penses-tu ?
jeudi 19 mars 2009 à 13:16:07 | Re : OpenGl bloqué par une Thread !?

Pistol_Pete

En fait, ils disent qu'il faut que tous les appels aux fonctions d'OpenGL ne se fasse que dans un seul thread. Cela signifie que tu peux sans problème créer un thread pour OpenGL et un thread pour pour le son...
A+

____________________________________________________________________________
Mon site internet :
  
[ Lien ]

jeudi 19 mars 2009 à 15:41:35 | Re : OpenGl bloqué par une Thread !?

spinzero

Membre Club

Je pense avoir bien formulé la thread :

void RunPhysics()
{
 // Update the time step
 NxReal deltaTime = UpdateTime();
 deltaTime = 0.02f; 
 //gScene->simulate(deltaTime);
 gScene->simulate(1.0f/60.0f)
 gScene->flushStream();
 gFrameCounter++;
}
//------------------------------------------------------------------------------------
void RenderCallback_1()
{
 if (gScene && !bPause)
 RunPhysics();
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 PhysicCORE::updateCAMERA();
 RenderScene(bShadows);
 
 gPerfRenderer.render(gScene->readProfileData(true), glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT));
glutSwapBuffers();
}
//------------------------------------------------------------------------------------
void setThread_RENDER()
 DWORD dwID;
     HANDLE threadHandle = CreateThread(NULL,
                 NULL,
                   (LPTHREAD_START_ROUTINE)RenderCallback_1,
                   NULL,//(LPVOID)this,
                   NULL,
                   &dwID);
}

void init()
{
 ...
 glutReshapeFunc(ReshapeCallback_1);
 glutDisplayFunc(setThread_RENDER);
 ...
}

...mais un autre problème se pose, que j'aurais sans doute du préciser :
RenderCallback_1()  fait aussi appel aux fonctions d'un moteur de physique, dont son timer RunPhysic() ...

 J'obtiens alors cette erreur :


f:\scvista\experimental\PhysX_2.8.1\novodex...etc
invlid paramter: Scene::simulation is still processing last simulate call, you should call fetchResults() !


Il me propose d'apeller une fonction fetchResults() mais peut être qu'il faut revoir l'approche de la thread ?

jeudi 19 mars 2009 à 15:57:42 | Re : OpenGl bloqué par une Thread !?

Pistol_Pete

Je n'aurai pas fait du tout comme ca: la, a chaque fois que tu veux afficher qqchose avec OpenGL, tu va créer un thread...

dans ton main, tu devrais faire;
int
WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpCmdLine, int show)
{
   CreateThread(0,0,StartOpenGL,0,0,&ThreadId);
   ....



Regarde ma source elle pourra d'aider. Elle fait fonctionner OpenGL et une application en win32:
http://www.cppfrance.com/codes/SYNTHESE-IMAGE-BRUIT-PERLIN-TEXTURES-MARBRE-BOIS_47220.aspx

____________________________________________________________________________
Mon site internet :
  
[ Lien ]

jeudi 19 mars 2009 à 16:23:39 | Re : OpenGl bloqué par une Thread !?

spinzero

Membre Club

"a chaque fois que tu veux afficher qqchose avec OpenGL, tu va créer un thread..."

Bon sang que c'est idiot, j'avais pas compris ;-)

Un peu de repos et je regarde ta source...

merci

vendredi 20 mars 2009 à 11:07:38 | Re : OpenGl bloqué par une Thread !?

spinzero

Membre Club

Salut Pistol

En m'inspirant de ta source, mes mofifs donnent :

define.h:

#ifndef DEFINE_H
#define DEFINE_H

#include <iostream>
#include <iomanip>
#include <sstream>
#include <strstream>
#include <string>
#include <vector>
#include <algorithm>
#include <numeric>

#if _MSC_VER > 1020  
   using namespace std; 
#endif

#include <GL/glut.h>
#include <stdio.h>
#include "NxPhysics.h"
#include "math.h"


main.h:

#ifndef MAIN_H
#define MAIN_H

#include "define.h"
//********************* AJOUTé pour les THREAD
#include <windows.h>
#include <time.h>
//**********************

#include <assert.h>

#include "NxCooking.h"
#include "DebugRenderer.h"
#include "PerfRenderer.h"

...
...
DWORD WINAPI StartOpenGL(LPVOID Param);
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpCmdLine, int show);
#endif

Main.cpp:

#include "Main.h"
//---SDK
#include "ErrorStream.h"
#include "Utilities.h"
#include "SamplesVRDSettings.h"
//---Resource filter
#include "Timing.h"
#include "GLFontRenderer.h"
...
...

void RenderCallback_1()
{
 if (gScene && !bPause)
 RunPhysics();
 
 // Clear buffers
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

 engine.gereScene();
 PhysicCORE::updateCAMERA();
 PhysicCORE::updateSHAPES();
 
RenderScene(bShadows);

 ...
 ...

 // Print profile results (if enabled)
 gPerfRenderer.render(gScene->readProfileData(true), glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT));
 glutSwapBuffers();
}

void InitGlut_1()
{
 int argc=1;
 char **argv=0;
 argv=new char*[2];
 argv[0]=new char[10];
 argv[1]=new char[10];
 
 strcpy(argv[0],"Name");
 //........................................

 glutInit(&argc, argv);
 glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);


 int x1=1400-wnW;int y1=50;
 glutInitWindowSize(wnW, wnH);
 glutInitWindowPosition(x1,y1);

 //........................................
 delete []argv[0];
 delete []argv[1];
 delete []argv;
 
 //........................................

 f1 = glutCreateWindow("SCENE");
 glutSetWindow(f1);

 InitGlut_0();

 glutReshapeFunc(ReshapeCallback_1);
 glutDisplayFunc(RenderCallback_1);//setThread_RENDER);//

 glutIdleFunc(IdleCallback);
 glutKeyboardFunc(KeyboardCallback);// DOWN
 glutKeyboardUpFunc(KeyboardUpCallback);// UP
 
 glutMouseFunc(MouseCallback);
 glutMotionFunc(MotionCallback);
 MotionCallback(0,0);


 atexit(ExitCallback);
 }
//------------------------------------

DWORD WINAPI StartOpenGL(LPVOID Param)

 InitGlut_1();

 // Initialize physics scene and start the application main loop if scene was created
 if (InitNx())//engine.init())//
 {
  glutMainLoop();
 }
 else
 {
  engine.~Engine(); 
  ReleaseNx();
 }

  return 0;
}
//-------------------------------------------------------------

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpCmdLine, int show)
{

 PrintControls();
  //---Initialisation du moteur
    if(engine.init())
 {//--passing Function through Struct in arg
       usrIn_o* o = new usrIn_o;
             o->getPhyxTM = *getPhysxTime;//timeGetTime;//
  engine.setPROP_o( o );
 }
 else
 {
        return EXIT_FAILURE;
 }

 #ifdef OPENGL
 CreateThread(0,0,StartOpenGL,0,0,&ThreadId);
 #endif


 //HWND hwnd;
    MSG msg;
 
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return (int)msg.wParam;

}

...j'ai du faire une erreur qlqpart car j'obtiens cette erreur  :

error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTSartup

File: MSVCRT.lib !

vendredi 20 mars 2009 à 11:27:38 | Re : OpenGl bloqué par une Thread !?

Pistol_Pete

Salut
Si tu as créé un projet console, il faut remplacer leWinMain par main.

A+

____________________________________________________________________________
Mon site internet :
  
[ Lien ]

vendredi 20 mars 2009 à 11:52:46 | Re : OpenGl bloqué par une Thread !?

spinzero

Membre Club

int WINAPI main( HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpCmdLine, int show);

j'ai tjrs la même erreur !


1 2 3

Cette discussion est classée dans : int, void, unsigned, attack, rtaudio


Répondre à ce message

Sujets en rapport avec ce message

Fch. Header :: CONIO.H [ par TontOnDuWeb ] Pour ce que ca interesse (avec vc++ les fonctions suivantes e sont pas incluse (du moins je crois...))>>#if !defined(__CONIO_H)#define __CONIO_H#if !d peek : probleme a la compilation. [ par Khahazad ] Bonjour, Lorsque je veux compiler ce code (que j'ai recupéré) avec dev-cpp Il genere des erreur que je n'arrive pas a corriger : [liker error] undef copier des données en memoire [ par rudybaka ] Bonjour je suis etudiant et j'aurai besoin d'aide pour une question de TP :Ecrire une fonction qui trie les valeurs d'un tableau d'éléments de type qu thread [ par dev_hy ] voila je veux utiliser les threads sous windows. alors j'ai crée un classe thread, dans la méthode de créeation de thread toute est bon mais il m'affi methode system() [ par sperate ] Bonjour,je code sur visual studio 2005 une simple application en mode console.j'utilise la methode "system()" pour envoyer des commandes simples genre Problème avec les polygones [ par nisaloncaje ] Bonjour, j'ai le code source suivant : #include #include double a=0,inca=0.1; /* Prototype des fonctions */void affichage();void clavier(unsigned Moultes questions pour un débutant [ par wismerhill__ ] Bonjour, pas mal de question pour le débutant en C++ que je suis ...Si qqn à le temps d'y répondre ce serait super gentil !1. A quoi sert de typer ses Convertion c++ à VB [ par jnbrunet ] Bonjours,Je ne suis pas très connaissant en c++.Est-ce que quelqu'un pourrait me traduire cette fonction en Visual Basic 6.0 ou .NET.P.S.: le pucData parcours en profondeur dans un graphe [ par Tavarez59282 ] Bonjour j'ai un sujet de tp à realiser sur les graphes à l'aide de listes d'adjacence et j'ai un incident de segmentation dans mon code lorsque j'exec PB POUR LA GESTION MULTIFENETRES [ par algeros ] Voici un code ://////////////////////////////////////////////////////////////////                                                          //   Name:


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,562 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales