IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Multithreading Discussion :

Utilisation de threads ?


Sujet :

Multithreading

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 56
    Par défaut Utilisation de threads ?
    EDIT : je viens de voir qu'il y a un sujet très similaire en cours. Dois-m'y greffer ou garder celui-ci ?


    Bonjour à tous,

    Je fais un lecteur audio pour pour projet informatique. L'interface graphique est gérée par Qt. Aucun problème pour créer l'interface. Mais pour gérer les actions (lancer la lecture d'un morceau, le mettre en pause, etc.) c'est terrible !

    Pour l'instant j'essaye de faire simplement un bouton que lance la lecture d'un fichier audio essai.mp3. En console, j'ai une fonction qui fonctionne, écrite avec FMOD :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    void lireFichier()
    {
       FMOD_SYSTEM      *system;
       FMOD_SOUND       *sound;
       FMOD_CHANNEL     *channel = 0;
       FMOD_RESULT       result;
       int               key;
     
       result = FMOD_System_Create(&system);
       result = FMOD_System_Init(system, 1, FMOD_INIT_NORMAL, NULL);
       result = FMOD_System_CreateSound(system, "essai.mp3", FMOD_SOFTWARE | FMOD_2D | FMOD_CREATESTREAM, 0, &sound);
     
       result = FMOD_System_PlaySound(system, FMOD_CHANNEL_FREE, sound, 0, &channel);
       do
       {
           if (channel)
           {
               if (kbhit())
               {
                   key = getch();
               }
           }
           FMOD_System_Update(system); //pas trop compris à quoi ça sert...
           Sleep(10);
       }
       while (key != 27); //tant qu'on appuie pas sur esc je suppose
     
       result = FMOD_Sound_Release(sound);
       result = FMOD_System_Close(system);
       result = FMOD_System_Release(system);
    }

    J'ai cru comprendre qu'il fallait utiliser QThread pour faire ce genre de choses, mais n'ayant aucune idée de la façon dont ça fonctionne je ne suis pas sûr.

    Deuxièmement, la documentation officielle est extrêmement succinte sur QThread, et je ne vois pas de rapport entre les exemples donnés et ce que je veux faire...

    Pourriez-vous confirmer qu'il faut utiliser QThread ? Si oui avez-vous une doc un peu plus détaillée que la doc officielle ? Si non, que faut-il faire ?

    Merci d'avance

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 129
    Billets dans le blog
    149
    Par défaut
    Bonjour,

    Utilisez QThread uniquement si votre projet incorpore déjà du Qt . Mais du coup, je viendrai à dire, pourquoi ne pas utiliser Phonon ?

    Maintenant, par rapport à la FMOD ... alors oui, il vous faudra un thread. Enfin ... oui et non. Disons que vous êtes surement sensé faire une interface, donc ... plus ou moins une boucle d'évènement ... qui donne la chose suivante (schématiquement):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    while (!needEscape)
    {
        ProcessEvents(); // Clavier ; Souris
        FMOD_Update();
        Attendre_15ms(); // Petit attente pour liberer le CPU
    }
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 56
    Par défaut
    Bonjour, merci de votre réponse !

    Je ne connaissais pas Phonon avant que vous le mentionniez en fait. Et comme on a déjà bossé sur Qt, je préfère ne pas changer d'orientation maintenant.

    En m'acharnant, j'ai réussi à créer un bouton qui lance la lecture d'un fichier essai.mp3 situé dans le repertoire dans lequel se situe l'executable !

    Pour cela je crée une classe qui hérite de Qthread :

    lireFichierAudio.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class lireFichierAudio : public QThread
    *{
         public:
         void run(); // je redéfinie la méthode run dans lireFichierAudio.cpp
     
         private:
         bool *m_paused;
         bool *m_playing;
         unsigned int *m_position;
         unsigned int *m_duree;
    };
    lireFichierAudio.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    void lireFichierAudio::run()
    {
         //ici je déclare des variables dans la méthode, je sais pas si j'ai vraiment le droit.
         //Ne faut-il pas mieux les déclarer dans lireFichierAudio.h ?
         FMOD::system *system;
         FMOD::Sound *sound;
         FMOD::Channel *channel=0;
     
         FMOD::System_Create(&system);
         system->init( 1 , FMOD_INIT_NORMAL , 0 );
         system->createSound( "essai.mp3" , FMOD_SOFTWARE | FMOD_2D | FMOD_CREATESTREAM , 0 , &sound);
         system->playSound(FMOD_CHANNEL_FREE , sound , false , &channel);
     
         do
         {
              if(channel)
              {
                   channel->getposition( m_position , FMOD_TIMEUNIT_MS ); // je voudrais ensuite créer un signal qui envoie la position à une QSlider pour visualiser l'avancement du morceau
                   sleep(10); //je sais pas pourquoi...
              }
         } while(1);
     
         sound->release();
         system->close();
         system->release();
    }
    Ensuite c'est juste un connect dans MainWindow.cpp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    QPushButton *play = new QPushButton("Play");
    lireFichierAudio *monThread = new lireFichierAudio();
    connect( play , SIGNAL(clicked()) , monThread , SLOT(start()));
    J'ai cependant plusieurs questions :
    1. Est-ce que le code vous parait correct ? Parce que j'ai écrit ça en tatônnant.
    2. J'arrive pas à créer un bouton "stop". Pour cela je crée un bouton, et je fait "connect(stop , SIGNAL(clicked()) , monThread , SLOT(quit()))"... Pas d'erreur à la compilation, mais quand je clique sur le bouton "stop" rien ne se passe...
    3. J'ai lu quelque part que dans les threads onutilisait parfois des "QEvents", mais j'ai pas tellement compris ce que c'était ni à quoi ça servait. Tout ce que j'ai compris c'est que ça concernait les boucles. Ça a l'air d'être en rapport avec le "processEvents" que vous mettez dans votre boucle, genre une boucle qui attend un click ou l'appui sur une touche pour déclencher une action. Mais pour ça il y a déjà les signaux et les slots non ?


    Merci pour vos réponse

    EDIT : J'espère qu'il n'y a pas d'erreur dans ce que j'ai écrit, parce que comme j'ai pas internet sur l'ordi sur lequel je programme, je recopie tout pour poster...

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 129
    Billets dans le blog
    149
    Par défaut
    Est-ce que le code vous parait correct ? Parce que j'ai écrit ça en tatônnant.
    Le code me parait étrange
    C'est dans le sens que dans votre méthode lireFichierAudio::run() il y a l'initialisation de FMOD. Ce qui voudrait dire, que si j'appuie deux choix sur votre bouton, je lance deux fois FMOD ... bouh (gros risque de plantage).
    De plus, il y a toujours votre que je trouve ... que j'aimerai qu'il ne soit pas.

    J'arrive pas à créer un bouton "stop". Pour cela je crée un bouton, et je fait "connect(stop , SIGNAL(clicked()) , monThread , SLOT(quit()))"... Pas d'erreur à la compilation, mais quand je clique sur le bouton "stop" rien ne se passe...
    Euh, si le connect ne fonctionne pas, il a dû afficher un message dans la console / écran de débugguage.
    Maintenant, j'ai réussi à voir un possible cas d'erreur pour ce point, vous devriez écrire:
    [codeconnect(stop , SIGNAL(clicked()) , qApp , SLOT(quit()))[/code] (qApp étante une instance de QApplication (même l'instance de QApplication)
    Car la méthode quit() se trouve dans la classe QApplication.

    Mais, car il y a un mais, si vous arrivez à faire ceci, FMOD est lamentablement fermé (fuite de mémoire / de ressources) ... et donc votre programme, malgré qu'il marche, sera faux.

    J'ai lu quelque part que dans les threads onutilisait parfois des "QEvents", mais j'ai pas tellement compris ce que c'était ni à quoi ça servait. Tout ce que j'ai compris c'est que ça concernait les boucles. Ça a l'air d'être en rapport avec le "processEvents" que vous mettez dans votre boucle, genre une boucle qui attend un click ou l'appui sur une touche pour déclencher une action. Mais pour ça il y a déjà les signaux et les slots non ?
    Je ne pense pas qu'il soit nécessaire d'aller aussi loin dans Qt. Avec les connect / signaux / slots cela devrait aller.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

Discussions similaires

  1. [VBA] utilisation de thread
    Par nemesys971 dans le forum VBA Access
    Réponses: 19
    Dernier message: 10/10/2008, 10h49
  2. Comment utiliser les Threads en VC++?
    Par mambo dans le forum MFC
    Réponses: 2
    Dernier message: 16/06/2006, 14h04
  3. BeginInvoke (utiliser les threads)
    Par the big ben 5 dans le forum Delphi
    Réponses: 6
    Dernier message: 16/05/2006, 18h30
  4. Utilisation des threads
    Par Valinor dans le forum Linux
    Réponses: 2
    Dernier message: 30/11/2005, 16h41
  5. Utilisations des Threads
    Par phoenix440 dans le forum Réseau
    Réponses: 15
    Dernier message: 21/08/2005, 17h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo