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 :

pointeur et Qthread


Sujet :

Multithreading

  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 68
    Par défaut pointeur et Qthread
    Bonjour je réalise un programme qui utilise la classe QThread de Qt, comme le dit la doc pour que les actions soit réaliser dans la thread, il faut l'allouer dans la thread. c'est ce que j'ai fait et cela fonctionne.

    Mon probléme est que quand je fermer le programme il plante en me disant que le pointeur ne peut être désallouer par une autre thread, ma question est comment je fait pour désallouer les pointeur allouer dans la fonction run()

    merci d'avance

  2. #2
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 68
    Par défaut
    Juste une précision, j'utilise QTimer pour exécuter une requête TCP en boucle avec QTcpSocket

    ça me dit en message debug, que le Qtimer ne peut être arrêter par une autre thread, et aussi que Qtcpsoket ne peut être désactiver par une autre instance?

    une idée?? merci

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    tu peux faire ça dans le destructeur de ta classe.

    G.

  4. #4
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 68
    Par défaut
    ca marche pas du tout y me dit: QSocketNotifier: socket notifiers cannot be disabled from another thread

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 68
    Par défaut
    je montre un peu mon code:

    ma fonction run():

    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
     
     
    void MyThread::run()
    {        
         // création de la socket
        _socket = new QTcpSocket(NULL);
        _socket->moveToThread(this);
     
        //socket Connection
        connect(_socket, SIGNAL(readyRead()), this, SLOT(donneesRecues()), Qt::DirectConnection);
        connect(_socket, SIGNAL(connected()), this, SLOT(connecte()), Qt::DirectConnection);
        connect(_socket, SIGNAL(disconnected()), this, SLOT(deconnecte()), Qt::DirectConnection);
        connect(_socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(erreurSocket(QAbstractSocket::SocketError)), Qt::DirectConnection);
     
        //start connection
        ConnectionToPlc();
     
        //creation du timer
        _Timer = new QTimer;
        _Timer->moveToThread(this);    
     
        //Timer Connection
        connect (_Timer, SIGNAL(timeout()), this, SLOT(SendPacket()), Qt::DirectConnection);
     
        //start loop
        _Timer->start(_TimeScale);
     
            exec();
    }
    mon destructeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    MyThread::~MyThread()
    {
        _Timer->stop();
        _socket->abort();
     
        delete _socket;
        delete _Timer;
    }
    j'ai essayé comme ca aussi: et ca fonctionne pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    MyThread::~MyThread()
    {
        _Timer->moveToThread(this);
        _socket->moveToThread(this);
     
        _Timer->stop();
        _socket->abort();
     
        delete _socket;
        delete _Timer;
    }
    pouvez-vous m'aider svp

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    Salut tes moveToThread ne serve à rien dans ton cas.
    Si tu alloue dans le run tu désalloue dans le run. C'est aussi simple que cela.

    Le top est de faire une classe héritant de QObject qui interface tous tes traitements.

    Ensuite tu créé un QThread et tu fait un moveToThread et tu lance le thread.

    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 myObject : public QObject
    {
        Q_OBJECT
     
    /*
    .................................
    */
    };
     
    /*...*/
     
    QThread * thread = new QThread;
    myObject * obj = new myObject;
    obj->moveToThread(thread );
     
    /*...*/


    ps : pour récupérer le QThread courant il faut mieux utiliser
    QThread * QThread::currentThread ();

  7. #7
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 68
    Par défaut
    ok merci pour ta réponse, just 2 petite questions par contre:

    - Quand tu dis de faire un classe héritant de Q_OJECT ou je fais tout mes traitement, tu veux dire que dans cette classe tu placerai le timer et la socket et que les traitement de la réponse tu le ferai dans une thread a part??

    - Aussi si je reste sur mon idée, comment puis-je arréter mon timer et ma socket dans mon run, et les supprimer aussi dans le run, vu que je les utilise tout le temps jusqu'a l'arret du programme???

    merci

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    Citation Envoyé par tiagocerqueira Voir le message
    - Quand tu dis de faire un classe héritant de Q_OJECT ou je fais tout mes traitement, tu veux dire que dans cette classe tu placerai le timer et la socket et que les traitement de la réponse tu le ferai dans une thread a part??i
    Oui. Depuis Qt 4.4 QThread implémente un run qui lance l'eventloop de la thread.

    Citation Envoyé par tiagocerqueira Voir le message
    Aussi si je reste sur mon idée, comment puis-je arréter mon timer et ma socket dans mon run, et les supprimer aussi dans le run, vu que je les utilise tout le temps jusqu'a l'arret du programme???
    Après le exec().
    Cette fonction est bloquante, jusqu'à ce qu tu stop l'eventloop du thread.

  9. #9
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 68
    Par défaut
    ca veut dire que si je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void MyThread::run()
    {
    _Timer = new QTimer;
    connect (_Timer, SIGNAL(timeout()), this, SLOT(SendPacket()), Qt::DirectConnection);
    _Timer->start(_TimeScale);
    delete _Timer
    exec();
    }
    si je fais ca, jusqu'a que je fasse MyThread::quit();
    mon _Timer sera pas supprimé???

  10. #10
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    J'ai dit aprés

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void MyThread::run()
    {
    _Timer = new QTimer;
    connect (_Timer, SIGNAL(timeout()), this, SLOT(SendPacket()), Qt::DirectConnection);
    _Timer->start(_TimeScale);
    
    exec();
    
    delete _Timer
    }
    D'ailleurs dans ton exemple autant ne pas faire de pointeur. QTimer sera détruit automatiquement.

    Si tu utilise un QObject sans parent, utilise std::auto_ptr au lieu d'un pointeur. Il le détruira de lui même

Discussions similaires

  1. pointeurs
    Par ghost74 dans le forum C
    Réponses: 3
    Dernier message: 14/12/2002, 02h52
  2. Pointeur vers un tableau
    Par Nikos dans le forum C
    Réponses: 3
    Dernier message: 09/12/2002, 00h43
  3. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14
  4. djgpp et pointeurs far -2
    Par elvivo dans le forum Autres éditeurs
    Réponses: 16
    Dernier message: 29/07/2002, 22h43
  5. djgpp et pointeurs far
    Par elvivo dans le forum C
    Réponses: 2
    Dernier message: 13/07/2002, 00h44

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