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 :

Mise en pause d'un thread avec un slot qui boucle


Sujet :

Multithreading

  1. #1
    Membre à l'essai
    Homme Profil pro
    ESEO
    Inscrit en
    Novembre 2015
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : ESEO
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2015
    Messages : 18
    Points : 16
    Points
    16
    Par défaut Mise en pause d'un thread avec un slot qui boucle
    Bonjour,

    Voici mon le programme que je souhaite réaliser :

    Des messages UDP arrivent dans une socket, ils sont déformatés puis la data est envoyée dans un graph pour y être affichée (j'utilise QCustomplot).

    J'ai donc défini 1 bouton et 1 graph dans la mainwindow. a l'initialisation un objet QThread est créé, et la fonction run connecte un signal (venant du bouton) à un slot (fonction d'un objet socket udp).

    Au moment de l'appui sur le bouton le slot du socket est appelé par dans le thread et la fonction se déroule dans une boucle qui receptionne le message, le déformate et envoie la data par un signal et ainsi de suite dans une loop.

    Le probleme est le suivant : comment arreter cette loop en appuyant une nouvelle fois sur le bouton ? Sachant que dans mon fonctionnement le thread qui réalise la réception est bloqué dans la boucle et ne peut donc pas prendre en compte un nouveau signal... La seule solution que je vois consiste à envoyer un message UDP depuis le thread principal qui contiendra un "Stop" et qui permettra de quitter la loop...

    Et une seconde question, je n'ai pas trouvé la réponse sur internet, est il possible d'avoir sur une fenetre Qt une interface (boutons) tournant avec le thread principal et un graph sur un second thread ? Cela pour eviter de freezer l'interface dans le cas d'un gros débit de data à afficher dans le graph

    Mon code actuel est tres fortement inspiré de ce tuto : Qthread - developpez.net

    La différence étant au niveau de la fonction : void doSort(const QVector<int> &v)
    Qui dans mon cas ne retourne pas apres avoir envoyé le signal mais boucle tant que l'on ne souhaite pas arreter l'acquisition


    Merci à vous

  2. #2
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    Dans la mesure du possible il vaut mieux utiliser la boucle d'évènements Qt que créer soi-même des boucles.
    Serait-il possible de ne pas attendre tes messages UDP dans une boucle mais seulement de les traiter un par un dans un slot ? Si tu peux avoir un signal à chaque nouveau message, tu traites dans un slot, tu retournes et Qt attendra pour toi les messages suivants. Du coup ça te permet de recevoir aussi d'autres signaux dans ton thread (pour se mettre en pause en l'occurrence).

    Tout traitement GUI doit être fait dans le thread principal (doc), donc je ne pense pas que tu puisses avoir un autre thread pour dessiner ton graphe. Ce qui peut être fait dans un autre thread est plutôt le traitement des données, si tu as des calculs à faire avant d'afficher le graphe par exemple. Mais dans ce cas là tu peux envisager d'utiliser directement QtConcurrent plutôt que créer toi même le thread etc.

  3. #3
    Membre à l'essai
    Homme Profil pro
    ESEO
    Inscrit en
    Novembre 2015
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : ESEO
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2015
    Messages : 18
    Points : 16
    Points
    16
    Par défaut
    Merci pour ta réponse.

    Pour ce qui est d'attendre les messages dans une boucle, je l'ai fais pour tenter d'avoir un fonctionnement plus rapide, en gros quand on appuie sur "ON" l'acquisition commence et les messages arrivent vraiment très rapidement et ils n’arrêtent d'arriver que lorsque l'on appuie sur le bouton "OFF". D'ou l'idée de rentrer dans un slot lors du ON, de traiter les messages et de renvoyer les donnée avec un signal, puis de sortir du slot une fois le OFF. Cela me permet aussi en utilisant un thread de traiter les messages dedans pour en extraire les datas sans me préoccuper que cela puisse freezer l'interface.
    Les deux solutions du coup seraient mon actuelle, en utilisant au moment du OFF un slot qui envoie un message UDP contenant comme data "STOP", ce message sera lut par le thread qui boucle et qui se terminerait a ce moment la, ou sinon utiliser ta méthode de signal/slot pour chaque message et faire le traitement des messages en parallèle, je voulais faire ça a l'origine mais la doc m'a fait changer d'avis, le signal émit par le socket pour prévenir de l'arrivée d'un message n'est pas répété a chaque message du coup j'ai peur de n'avoir qu'un seul signal puis que les messages se stockent dans le socket en n’émettant plus rien...?

Discussions similaires

  1. pool de thread avec des tâches qui boucle infiniment
    Par archer dans le forum Threads & Processus
    Réponses: 2
    Dernier message: 15/04/2013, 03h39
  2. [AC-2010] Mise en réseau d'une base avec réseau lent
    Par vandrie dans le forum Modélisation
    Réponses: 2
    Dernier message: 04/09/2011, 07h51
  3. Mise en forme d'une table avec du PHP
    Par Lorgar dans le forum Langage
    Réponses: 2
    Dernier message: 15/07/2011, 15h31
  4. [MySQL] mise a jour sur une table avec MD5
    Par Invité dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 25/11/2010, 11h58
  5. Projet : Mise en place d'une solution avec XML/XSL
    Par kokogil dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 25/06/2008, 08h59

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