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 :

[QThread] créer un thread


Sujet :

Multithreading

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 89
    Points : 60
    Points
    60
    Par défaut [QThread] créer un thread
    Bonjour à tous,

    Je me suis récemment mis à QT, et là j'en bave convenablement pour faire du multi-threading...

    En C++ (sans QT), j'utilisais PThread, et tout marchait... j'ai essayé dans QT, et ça ne marchait plus... alors j'ai vu qu'il y avait la bibliothèque QThread, mais malheureusement, je ne comprends rien à la doc :'(

    Mon problème : j'ai une application qui réalise un gros calcul (très long, qui peut durer des minutes :s) dès qu'on clique sur un bouton... La connection marche niquel, mais au bout de quelques secondes, Windows me dit que mon application ne répond plus... ça m'embête... euh ... beaucoup ^^

    J'ai vu qu'en faisant du multi-threading on pouvait résoudre ce problème... Mais comment ???

    Voici une partie de mes sources :

    mainwindow.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
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QFile>
    #include <QTextStream>
    #include <QFileDialog>
    #include <QComboBox>
     
    using namespace std;
     
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent), ui(new Ui::MainWindowClass)
    {
        ui->setupUi(this);
        QObject::connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(search()));
        QObject::connect(ui->parcourir, SIGNAL(clicked()), this, SLOT(ouvrirDialogue()));
    }
     
    MainWindow::~MainWindow()
    {
        delete ui;
    }
     
    void MainWindow::search()
    {
        // ma phase de calcul
    }
     
    void MainWindow::ouvrirDialogue()
    {
        QString fichierSelectionne = QFileDialog::getOpenFileName(this, "Ouvrir un fichier", QString(), "Tous (*.*)");
        ui->fichier->setText(fichierSelectionne);
    }
    mainwindow.h
    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
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
     
    #include <QtGui/QMainWindow>
     
    namespace Ui
    {
        class MainWindowClass;
    }
     
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
     
    public:
        MainWindow(QWidget *parent = 0);
        ~MainWindow();
     
    private:
        Ui::MainWindowClass *ui;
     
    private slots:
        void search();
        void ouvrirDialogue();
    };
     
    #endif // MAINWINDOW_H
    Comment faire ?? Merci d'avance.
    Dans 1 km, y'a 1024 m... C'est simple non?

    Mon entreprise : Steel-Studio

  2. #2
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Salut,

    C'est balot que tu ais masqué le contenu de search(), la seule méthode intéressante pour chercher le problème
    Je ne vois nul part l'utilisation de QThread dans ton post, c'est aussi important de nous le montrer.

    A propos de QThread, il y a une chose à comprendre avant toute autre: le thread est spawné au moment où tu appelles QThread::start(), et le thread exécute la méthode run() (que tu dois surcharger pour faire ce que tu veux). Uniquement les méthodes appellées dans le/à partir du run(), directement ou indirectement, sont exécutées dans le thread.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 89
    Points : 60
    Points
    60
    Par défaut
    J'ai trouvé une classe de base, et je suis arrivé à créer le thread, mais seul problème, je ne sais pas quoi mettre dans la méthode run()...

    Enfin... quoi mettre pour que mon application ne plante pas dès que je lance le calcul...

    Si il n'y avait pas de QThread dans mon post précédent, c'est parce que j'ai mis la version de mon app sans QThread où le calcul marche niquel (aucune erreur de compilation, c'est juste Vista qui saoule en disant qu'il ne répond plus, mais dès qu'il a fini le calcul, bah ça revient )
    Dans 1 km, y'a 1024 m... C'est simple non?

    Mon entreprise : Steel-Studio

  4. #4
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Tu as juste à mettre ton calcul dans la réimplémentation de QThread::run(), je ne vois pas encore où est le problème.
    Par contre, si tu détaillé un peu le calcul, nous pourrions commencer à comprendre où le problème est (dépendance des données etc...)

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 89
    Points : 60
    Points
    60
    Par défaut
    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
    QFile file(MainWindow::ui->fichier->text());
        if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
        {
             MainWindow::ui->textBrowser->setHtml("<strong><center>Le fichier n'a pas été trouvé !</center></strong>");
        }
        else
        {
             if(MainWindow::ui->chaine->text()!=NULL){
                 QByteArray line;
                 QString chainetrouve;
                 int i=0;
                 while (!file.atEnd() && i == 0)
                 {
                    line = file.readLine();
                    chainetrouve= line;
                    int nbTruncateCrypt = ui->len->text();
                    chainetrouve.truncate(nbTruncateCrypt);
                    if(chainetrouve==MainWindow::ui->chaine->text())
                    {
                        QString say;
                        QString buffer = line;
                        say = "<strong><center>Chaîne trouvée !</center></strong>";
                        MainWindow::ui->textBrowser->setHtml(say);
                        i=1;
                    }
                 }
                 if(i==0)
                 {
                     ui->textBrowser->setHtml("<center>La chaîne n'a pas été trouvée...<br>Veuillez réessayer avec un autre fichier.</center>");
                 }
            }
        }
    Voilà mon code
    Dans 1 km, y'a 1024 m... C'est simple non?

    Mon entreprise : Steel-Studio

  6. #6
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Pour commencer, on n'utilise pas d'opérations graphiques dans un thread. Donc tu passes à ton thread le fichier à ouvrir, la chaine à chercher, etc... (tout ce qu'il faut pour réaliser la tâche lourde), et tu lances ton thread avec QThread::start().
    Dans la méthode run, tu t'appuies sur les infos données précédemment pour faire ta recherche. Une fois fini, tu peux envoyer un signal (que tu auras créé dans ta classe dérivant de QThread) pour signaler le résultat de la recherche (trouvé ou non).

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 89
    Points : 60
    Points
    60
    Par défaut
    Merci beaucoup, je vais essayer comme ça =)
    Dans 1 km, y'a 1024 m... C'est simple non?

    Mon entreprise : Steel-Studio

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

Discussions similaires

  1. Créer un thread
    Par Tangui dans le forum Langage
    Réponses: 1
    Dernier message: 10/06/2008, 07h33
  2. Créer des Thread pour le composant TClientSocket
    Par mastok007 dans le forum C++Builder
    Réponses: 4
    Dernier message: 06/02/2008, 23h22
  3. Créer des threads a l'exécution
    Par supergg02 dans le forum Débuter
    Réponses: 1
    Dernier message: 03/09/2007, 13h26
  4. [PHP-JS] Comment créer un thread ?
    Par supertom dans le forum Langage
    Réponses: 7
    Dernier message: 31/05/2007, 10h45
  5. [Thread]Comment créer plusieurs thread à la demande??
    Par Devil666 dans le forum Concurrence et multi-thread
    Réponses: 8
    Dernier message: 14/09/2005, 13h29

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