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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 ();

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