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 :

Impossible de terminer une boucle infinie


Sujet :

Multithreading

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juillet 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juillet 2011
    Messages : 11
    Points : 5
    Points
    5
    Par défaut Impossible de terminer une boucle infinie
    Bonjour tout le monde,
    Je lance dans un QThread une procédure de traitement d'image qui peut prendre du temps (~3 heures) avec l'impossibilité d'avoir des points de contrôles à l'intérieur de le procédure pour une possible sortie. Le soucis est que je n'arrive pas à terminer l'exécution de la procédure une fois lancé. Ce code représente le problème :
    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
    class Toto : public QObject
    {
        Q_OBJECT
    public slots:
        void exec(){
     
            //I represent the real process (image processing on very large image) with an infinite loop
            while(1==1);
        }
    };
    int main(int argc, char *argv[])
    {
        QApplication aa(argc, argv);
        QThread * t1 = new QThread;
        Toto * toto1 = new Toto;
        QThread * t2 = new QThread;
        Toto * toto2 = new Toto;
        QPushButton push;
        push.show();
        toto1->moveToThread(t1);
        toto2->moveToThread(t2);
        QMetaObject::invokeMethod(toto1, "exec", Qt::QueuedConnection);
        QMetaObject::invokeMethod(toto2, "exec", Qt::QueuedConnection);
        QApplication::connect(&push, SIGNAL(pressed()), t1,SLOT(terminate()), Qt::QueuedConnection);
        QApplication::connect(&push, SIGNAL(pressed ()), t2,SLOT(terminate()), Qt::QueuedConnection);
        t2->start();
        t1->start();
        return aa.exec();
    }
    Auriez-vous une solution ?
    Merci

  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
    [quote=vincent tariel;6526146]Bonjour tout le monde,
    Je lance dans un QThread une procédure de traitement d'image qui peut prendre du temps (~3 heures) avec l'impossibilité d'avoir des points de contrôles à l'intérieur de le procédure pour une possible sortie. [QUOTE=vincent tariel;6526146]
    pourquoi?

    Le soucis est que je n'arrive pas à terminer l'exécution de la procédure une fois lancé
    Si tu peux pas mettre de point de contrôle comment veux tu terminer la procédure une fois lancer??

    As tu regardé la FAQ? As tu essayé d'utiliser les QtConcurrent?

    Si tu donne quelque détaille sur ton algo, on devrais pouvoir t'orienter.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juillet 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juillet 2011
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Merci Yan,
    En réalité, cette boucle infini est dans chaqu'un de mes algorithmes de ma librairie de traitements d'images. Soit plus de 200 algorithmes.
    Dans d'autres libraires de multi-threading, il est possible de faire le "pirate" en tuant le thread sans points de contrôles dans le thread.
    Sinon je vais me renseigner sur QtConcurrent.
    Merci encore

  4. #4
    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 vincent tariel Voir le message
    Merci Yan,
    En réalité, cette boucle infini est dans chaqu'un de mes algorithmes de ma librairie de traitements d'images. Soit plus de 200 algorithmes.
    Vue comme cela c'est compliqué ^^ ou alors tu modifie tes 200 algo. T'as pas un stagiaire ?

    Pourquoi une boucle infinie en faite???
    N'y as t'il vraiment aucun moyen de mettre un point de sortie quelque part?


    Citation Envoyé par vincent tariel Voir le message
    Dans d'autres libraires de multi-threading, il est possible de faire le "pirate" en tuant le thread sans points de contrôles dans le thread.
    En Qt c'est :
    http://developer.qt.nokia.com/doc/qt...html#terminate


    Citation Envoyé par vincent tariel Voir le message
    Sinon je vais me renseigner sur QtConcurrent.
    Dans ton cas je pense que c'est inutile... Mais c'est intéressant de connaitre.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juillet 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juillet 2011
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    C'est ce que je croyais aussi. Selon le doc qt :
    The thread can be terminated at any point in its code path
    Mais quand j'ai essayé je n'ai pas obtenu le résultat escompté.
    Merci en tout cas.
    Donc pas de solution hormis un restart. Belle application en perspective

  6. #6
    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 vincent tariel Voir le message
    Mais quand j'ai essayé je n'ai pas obtenu le résultat escompté.
    C'est à dire?
    Comment lance tu le thread?

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juillet 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juillet 2011
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Le thread n'est pas terminé.

  8. #8
    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 vincent tariel Voir le message
    Le thread n'est pas terminé.
    Peux tu montrer comment tu lance ton thread?

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juillet 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juillet 2011
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Salut Yan,
    Je le lance exactement comme dans le code donné dans mon premier message.

  10. #10
    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
    Comme ton objet bloque l'eventloop du thread pour son exécution

    Terminate ne peut être appelé comme cela. QueuedConenction ajout un event dan sle thread pour exécuter le slot.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QApplication::connect(&push, SIGNAL(pressed()), t1,SLOT(terminate()), Qt::QueuedConnection);
    Il te faut donc appeler directement terminate.
    Ceci devrais aussi marcher
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QApplication::connect(&push, SIGNAL(pressed()), t1,SLOT(terminate()), Qt::DirectConnection);

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juillet 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juillet 2011
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Merci Yan mais la boucle infini continue à tourner même avec cette modification. Pour information, je suis sous Linux.

  12. #12
    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 vincent tariel Voir le message
    Merci Yan mais la boucle infini continue à tourner même avec cette modification. Pour information, je suis sous Linux.
    tu parle du Qt::DirectConnection?

    essaie de mettre une faux calcule dans ta boucle. C'est possible que ta boucle prend tout le proc et ton ihm est en réalité figé. Tu as un proc monocoeur?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Toto : public QObject
    {
        Q_OBJECT
    public slots:
        void exec(){
                   int i =0;
            //I represent the real process (image processing on very large image) with an infinite loop
            while(1==1)
                     i+= rand();
        }
    };

Discussions similaires

  1. Terminer proprement une boucle infinie
    Par pynoob dans le forum Général Python
    Réponses: 11
    Dernier message: 10/02/2011, 19h23
  2. Select qui fais une boucle infinie
    Par MaitrePylos dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 28/03/2006, 17h29
  3. Réponses: 10
    Dernier message: 24/12/2005, 15h35
  4. evenement pour terminer une boucle
    Par ZaaN dans le forum MFC
    Réponses: 1
    Dernier message: 06/12/2005, 10h26
  5. [FTP] comment corriger une boucle infinie ?
    Par sofybj dans le forum Langage
    Réponses: 8
    Dernier message: 08/11/2005, 14h49

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