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 :

boost::thread et Qt


Sujet :

Multithreading

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut boost::thread et Qt
    Bonjour à tous,


    Le chargement de mon application met environs 2 minutes (le temps de rapatrier une assez grosse quantité de données depuis la base de données).

    C'est pourquoi j'ai fait une petite boite de chargement avec une barre de progression au lancement.

    Comme le chargement envoie des requêtes vers la base de données, le temps que la réponse vienne, l'application est figée. C'est domage car il y a un style de progressbar assez sympa où une espèce de lueur parcours régulièrement la zone d'avancement, mais si c'est pas fluide...

    C'est pourquoi j'ai tenté d'utiliser les threads de boost. Malheureusement, et je m'en doutais un peu avant de le faire, mon évennement de lecture des données qui provoque l'avancement d'une barre de progression est lancé depuis le thread dédié au chargement.

    Et je me retrouve avec une erreur assertion Qt m'indiquant que les objets appartenant à un thread ne peuvent être manipulés par un autre thread.

    Y a-t-il une solution de contournement ?


    Merci

    A bientôt
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Pourquoi ne pas utiliser QThread???

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    C'était pour etre rapide, j'étais habitué à boost::thread.

    Je suis en train de changer pour QThread là, voire si ça fonctionne

    Merci
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Heu... j'ai pas la méthode "start" avec QThread... c'est normal ?
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  5. #5
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par mister3957 Voir le message
    Heu... j'ai pas la méthode "start" avec QThread... c'est normal ?
    ??? comment cela?
    http://qt.developpez.com/doc/4.4/qthread/#start

  6. #6
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Les threads de Qt sont réentrants, c'est à dire qu'ils permettent de se transmettre des données entre eux.

    Par contre, je ne suis pas sûr que Qt laisse boost::thread mettre son nez là où Qt attend plutôt des QThread.

    Donc dans une application Qt, il est bien plus sûr d'utiliser des QThread.

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Heu pour cette méthode start, c'était intellisence qui ne me l'affichait pas, par contre, il m'affichait les autres méthodes de QThread... bizarre.

    Ok pour l'explication. Après implémentation, je reçois toujours la même assertion :

    "Cannot send events to objects owned by a different thread. Current thread 12fe34. Receiver 'DlgLoad' of type 'QDialog') was created in thread 261e3d0"
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  8. #8
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Tu es bien passé aux QThread ?
    On peut voir le code qui concerne le partage de données entre threads ? (surtout les connexions entre signaux et slots qui servent à partager)

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Ha j'ai pas utilisé les slots et les signaux...

    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
     
    class ILoaderListener
    {
    public:
         virtual void OnBeginLoad(const char* sEntity) = 0;
         virtual void OnEndLoad() = 0;
    };
     
    class CLoader : QThread
    {
    public:
         virtual void run()
         {
              NotifyBeginLoad("Clients");
              GesClients.Load();
     
              NotifyBeginLoad("Véhicules");
              GesVehicles.Load();
     
              NotifyEndLoad();
         }
     
    private:
         std::vector<ILoadListener*> m_vecListeners;
         NotifyBeginLoad(const char* s);
         NotifyEndLoad();
    };
     
    class CDlgLoader : public QDialog, public ILoadListener
    {
    public:
         // constructeur normal
     
    protected:
         void OnBeginLoad(const char* s);
         void OnEndLoad();
     
    private:
         CLoader m_loader;
         QProgressBar* m_pProgressBar;
         unsigned int m_uiLoading;
    };
     
    CDlgLoader::OnBeginLoad(const char* s)
    {
        m_pProgressBar->setValue(++m_uiLoading);
    }
    Un truc comme ça.

    Que faut-il que je fasse pour utiliser les slots et les signaux ?
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  10. #10
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    http://matthieu-brucher.developpez.c...t/signal-slot/
    http://qt.developpez.com/faq/?page=qt4Core#signalslot
    http://qt.developpez.com/faq/?page=q...ace_signalslot
    http://qt.developpez.com/faq/?page=q...eer_signalslot

    Tous ces liens expliquent assez bien ce mécanisme.

    Ca permet de déclencher un signal qui va automatiquement appeler une fonction (le slot). Ce système permet dans Qt de communiquer entre threads. Tu peux ainsi avoir un signal dans un thread et le slot dans un autre thread.
    Avec la possibilité de passer les valeurs, tu as ce que tu veux : transmettre des informations entre plusieurs threads.

  11. #11
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Ok merci beaucoup,

    J'ai acheté un bouquin pour mieux intégrer Qt.

    En attendant, voici ce que j'ai fait:

    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
     
    class CLoader : public QThread
    {
    Q_OBJECT
     
    signals:
        void BeginRead(QString&);
    };
     
    class CDlgLoader : public QDialog
    {
    Q_OBJECT
     
    public slots:
         void s_BeginRead(QString&);
    }
    Pour connecter la boite de dialogue avec le chargeur je fais, dans la boite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    connect(&m_loader, SIGNAL(BeginRead(QString&)), this, SLOT(s_BeginRead(QString&)));
    et pour lancer l'évennement dans le chargeur je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    emit BeginRead("test")
    Mais aparemment rien n'est envoyé.

    Pour faire un test, j'ai mi un signal qui n'existait pas dans connect "BeginReadTest", le compilateur a correctement compilé :s


    J'ai loupé quelque chose ?


    Merci beaucoup
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  12. #12
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Je suppose que tu as bien utilisé moc ?
    Sinon ça ne compilerait pas.

    (tout ce qui concerne la réentrance est expliqué très bien dans le bouquin Qt 4 et C++)

  13. #13
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Oui j'ai bien utilisé moc

    Bé je pars à Dublin là, j'verrai avec le livre Qt4 et C++ lundi


    Merci
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  14. #14
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Salut, tu ne peut avoir un slot qui contient une référence... car l'objet ne peut être copié (c'est ce qui se passe quand tu connat un signal et un slot entre deux thread )
    Par contre tu peut utiliser une references constante, la la copie de l'objet est autorisé

    Pour ce qui est de QString et la pluspart des class QT, il faut savoir qu'elles utilisent le COW et que donc la copie d'un objet n'ets que partiel. Il n'est donc pas spécialement utilise d'utiliser des références pour les slots.

    SInon vue que tu as eu des warning, il faut aussi comprendre :
    1- QThread n'est une thread. C'est une class permettant de manipulé une thread
    2- chaque objet créé dans une thread appartien à la thread => QThread n'appartient pas à la thread
    3- le code correspondant à la thread est le run. Il faut donc créé tes objet ici
    4- un signal est thread safe.
    5- si tu veut connecté un signal vers le slot d'un objet d'une autre thread, cette thread doit avoir lancé son evenloop.
    6- Depuis Qt 4.4, il existe les QtConcurrent. Tu devrait regarder.

    Si tu as des questions, n'hésite pas.
    http://qt.developpez.com/doc/4.4/threads/
    http://qt.developpez.com/doc/4.4/sha...plicit-sharing

  15. #15
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Impeccable, j'ai juste rajouté le const et ça fonctionne.


    J'ai plus qu'à me former à fond à Qt, faire un exemple dans le context de mon travail et convaincre mon boss d'abandonner les MFC.


    Est-ce que vous avez une idée du prix de la license Qt ? j'ai cherché sur leur site mais à chaque fois ils redirigent vers le service commercial...

    Et est-ce que c'est possible de développer la première application avec la version Open Source, et d'acheter la license pour mettre en production ? J'ai entendu dire que non, si on avait fait le projet en Open Source, fallait acheter la license, refaire le projet avant de distribuer commercialement...


    En tout cas merci beaucoup


    A bientôt
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  16. #16
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par mister3957 Voir le message
    J'ai plus qu'à me former à fond à Qt, faire un exemple dans le context de mon travail et convaincre mon boss d'abandonner les MFC.
    ca ne devrait pas être trés dure


    Est-ce que vous avez une idée du prix de la license Qt ? j'ai cherché sur leur site mais à chaque fois ils redirigent vers le service commercial...
    C'est à voire avec eux.

    Et est-ce que c'est possible de développer la première application avec la version Open Source, et d'acheter la license pour mettre en production ? J'ai entendu dire que non, si on avait fait le projet en Open Source, fallait acheter la license, refaire le projet avant de distribuer commercialement...
    en faite tu peut utiliser une version de demo jusqu'à ce que tu achète la licence

  17. #17
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Ok merci
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

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

Discussions similaires

  1. Arreter l'execution d'un boost::thread
    Par stranger dans le forum Boost
    Réponses: 9
    Dernier message: 22/05/2007, 18h37
  2. [Débutant] boost::thread non-lvalue
    Par Tymk dans le forum Boost
    Réponses: 16
    Dernier message: 18/11/2006, 14h23
  3. Questions de perfomance avec boost::thread
    Par Rafy dans le forum Boost
    Réponses: 36
    Dernier message: 05/10/2006, 15h21
  4. boost::thread et OpenGL
    Par Kurisu dans le forum Boost
    Réponses: 12
    Dernier message: 19/09/2006, 13h23

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