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 :

Commencer avec QThread et une boucle infinie [QThread]


Sujet :

Multithreading

  1. #1
    Membre régulier
    Inscrit en
    Septembre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2007
    Messages : 267
    Points : 119
    Points
    119
    Par défaut Commencer avec QThread et une boucle infinie
    Salut,

    J'essaie de créer un programme de reconnaissance musicale ( voici le sujet principale )
    L'application en background fonctionne bien, elle enregistre 30 secondes du son qui sort des enceintes, et lance l'analyse vers un site internet, recois et enregistre l'artiste et le titre dans un fichier texte.

    Je veux en plus créer une icone dans le system tray qui affiche une infobulle à chaque reconnaissance d'une musique. Je me suis donc tourné vers Qt, et je veux utiliser QThread pour executer le code de reconnaissance musicale. Ce thread s'executera à l'infini.

    Je dois faire une erreur de débutant quelque part parce que j'ai suivit des tuto, et ce code ne fonctionne pas : la fenêtre (que je cacherais dans le futur, parce que je ne veux faire qu'une icône dans le system tray), donc la fenêtre ne répond pas, ni le menu de l'icône dans le system tray, mais la boucle de reconnaissance musicale fonctionne, tout comme si je ne faisais pas de thread et que je collais le code de reconnaissance musicale dans le main juste après w.show();

    voici le code :

    main.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
    #include <stdlib.h>
    #include <windows.h>
    #include <tchar.h>
    #include <fstream>
    #include <string>
    #include <QSystemTrayIcon>
    #include <QWidget>
    #include <QMenu>
    #include <QLabel>
    #include <QApplication>
    #include <QThread>
    #include "window.hpp"
    #include "RecognitionThread.hpp"
     
    using namespace std;
     
    #undef main
    int main(int argc, char **argv)
    {
        QApplication app(argc, argv);
        Window w;
        RecognitionThread* T = new RecognitionThread();
        w.show();
        T->run();
        return app.exec();
    }
    window.hpp
    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
    #ifndef WINDOW_HPP
    #define WINDOW_HPP
    #include <QSystemTrayIcon>
    #include <QWidget>
    #include <QMenu>
    #include <QLabel>
    #include <QApplication>
    #include <QObject>
     
    class Window : public QWidget
    {
        Q_OBJECT
        public:
            Window();
            ~Window();
     
        private:
            QLabel* text;
     
        private slots:
            void changeTexte1();
            void changeTexte2();
    };
     
    #endif
    window.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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    #include "window.hpp"
    #include <QSystemTrayIcon>
    #include <QWidget>
    #include <QMenu>
    #include <QLabel>
    #include <QApplication>
     
    Window::Window()
    {
        text = new QLabel("unknown", this);
        resize(300,100);
     
        // Builds icon
        QSystemTrayIcon* sticon;
        sticon = new QSystemTrayIcon(NULL);
        QIcon icon("music.ico");
        sticon->setIcon(icon);
     
        // Builds menu and menu items
        QMenu* stmenu = new QMenu(NULL);
        QAction* actTexte1 = new QAction("unknown",NULL);
        QAction* actTexte2 = new QAction("Capturing...",NULL);
        QAction* actTexte3 = new QAction("Quit",NULL);
        stmenu->addAction(actTexte1);
        stmenu->addAction(actTexte2);
        stmenu->addAction(actTexte3);
     
        sticon->setContextMenu(stmenu);
     
        sticon->show();
        sticon->showMessage("unknown","unknown");
     
        connect(actTexte1, SIGNAL(triggered()), this, SLOT(changeTexte1()));
        connect(actTexte2, SIGNAL(triggered()), this, SLOT(changeTexte2()));
    }
     
    Window::~Window()
    {
     
    }
     
    void Window::changeTexte1()
    {
     
    }
     
    void Window::changeTexte2()
    {
     
    }
    RecognitionThread.hpp
    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
    #ifndef THREAD_HPP
    #define THREAD_HPP
    #include <stdlib.h>
    #include <windows.h>
    #include <tchar.h>
    #include <fstream>
    #include <string>
    #include <QThread>
    #include <QObject>
     
    using namespace std;
     
    class RecognitionThread : public QThread
    {
        Q_OBJECT
     
        public:
              RecognitionThread(QObject* parent = NULL);
              ~RecognitionThread();
              void run();
    };
     
    #endif
    RecognitionThread.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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    #include "RecognitionThread.hpp"
    #include <stdlib.h>
    #include <windows.h>
    #include <tchar.h>
    #include <fstream>
    #include <string>
    #include <QThread>
     
    using namespace std;
     
    RecognitionThread::RecognitionThread(QObject* parent):QThread(parent)
    {
            start();
    }
    RecognitionThread::~RecognitionThread()
    {
         exit();
         wait();
    }
     
    void RecognitionThread::run()
    {
       // Following lines needed for CreateProcess(), startupinfo receive the output of the process run
        PROCESS_INFORMATION procinfo = {0};
        STARTUPINFO startupinfo = {0};
        ZeroMemory( &startupinfo, sizeof(startupinfo) );
        startupinfo.cb = sizeof(startupinfo);
        startupinfo.dwFlags |=STARTF_USESTDHANDLES ;
        startupinfo.hStdInput=GetStdHandle(STD_INPUT_HANDLE);
        startupinfo.hStdError=GetStdHandle(STD_ERROR_HANDLE);
        SECURITY_ATTRIBUTES sa;
        ZeroMemory( &sa, sizeof(sa) );
        sa.nLength=sizeof(sa);
        sa.bInheritHandle=TRUE;
     
        // Declaration of read and written files
        ofstream messageFile;
        ifstream infoFile;
     
        string message;
        string info;
     
        // Position of words found in info (string), string::npos if not found
        size_t found_song_id,found_artist_b1,found_artist_b2,found_artist_e,found_title_b1,found_title_b2,found_title_e;
     
        string artist,title;
     
    // Here, the loop begins
    start :
        CODE DE RECONNAISSANCE MUSICALE, QUI DURE ENVIRON 80 SECONDES
    goto start; // End of the loop
    }

    Je vous remercie d'avance pour votre contribution.

  2. #2
    Membre régulier
    Inscrit en
    Septembre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2007
    Messages : 267
    Points : 119
    Points
    119
    Par défaut
    ok start() au lieu de run().
    Résolu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. arrêter une boucle infinie avec DoEvents
    Par 3aychoucha dans le forum C++/CLI
    Réponses: 5
    Dernier message: 31/03/2011, 21h48
  2. probleme avec une boucle infinie
    Par hunter99 dans le forum C++
    Réponses: 3
    Dernier message: 26/12/2007, 23h37
  3. Réponses: 10
    Dernier message: 24/12/2005, 15h35
  4. [FTP] comment corriger une boucle infinie ?
    Par sofybj dans le forum Langage
    Réponses: 8
    Dernier message: 08/11/2005, 14h49
  5. Problème avec TNMSMTP dans une boucle.
    Par Orgied dans le forum Web & réseau
    Réponses: 3
    Dernier message: 07/04/2004, 10h19

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