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

Discussion :

Pinger sans bloquer la fenêtre courante

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur c++ junior
    Inscrit en
    Mai 2013
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur c++ junior
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2013
    Messages : 35
    Par défaut Pinger sans bloquer la fenêtre courante
    Bonjour,
    Je suis débutant sur QT et j'ai besoin d'aide
    J'utilise QT5.5 et Ubuntu 16.04.
    J'ai écrit un petit programme qui lit des flux de plusieurs camera IP (en utilisant l'exemple vlc_on_qt que l'on peut trouver ici https://wiki.videolan.org/LibVLC_SampleCode_Qt/ ).
    Mes adresses ip et mes adresses de flux sont contenus dans des fichiers de configuration que je lis au début de mon programme, le programme stock en mémoire toutes les adresses IP puis lis les stream tour à tour pendant 10sec chacun.
    L'idée de mon évolution est de pinger toutes les cameras (pour vérifier si elles répondent bien) pendant la lecture du flux de ma première camera ( dans mon context je suis sur que celle-ci réponde bien).
    Je voulais utiliser des QProcess pour lancer les ping et récupérer les signaux pour faire le traitement. Mes données sont stockées dans une QMap<QString nom_de_cam, struct dataCamera>, la struct contenant mon ip et l'url du stream. L’idée était d'associer dans une QMap chaque camera un QProcess et d’itérer sur cette QMap pour les lancer.

    Cette fonction initialise ma QMap de QProcess
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void ConfigCamera::initMapProc()
    {   QMap<QString, dataCamera*>::iterator it;
        for ( it = mapDataCamera.begin(); it!=mapDataCamera.end() ; it++)
        {
           mapProcCam[it.key()]=new QProcess();
           QObject::connect(mapProcCam[it.key()], SIGNAL(finished(int, QProcess::ExitStatus)), this,SLOT(MessagingR(int, QProcess::ExitStatus)));//SLOT(MessagingR(int, QProcess::ExitStatus)));
        }
        qDebug() << "The map mapProCam is creating" << mapProcCam;
    }
    C'est ici que je lance mes ping :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void ConfigCamera::pingAndConf() // les QProcess ne répondent pas, je ne sais pas pourquoi
    {
     
     
       initMapProc();  // for(auto e : mapDataCamera.keys())
       QMap<QString, QProcess*>::iterator it;
       for ( it = mapProcCam.begin(); it!=mapProcCam.end() ; it++)
       {
     
           mapProcCam[it.key()]->start("ping", QStringList() << "-c" << "1" << "8.8.8.8"); //ici 8.8.8.8 pour vérifier si le code fonctionne
         //mapProcCam[it.key()]->waitForFinished(-1);
       }
    Lorsque je décommante mon waitForFinished tout ce passe bien, mais de façon bloquante ( mon flux ne se lance pas tant que les ping n'ont pas tous répondu) et si j'enlève ce waitForFinished je ne récupère jamais mes signaux et mes ping ne répondent jamais :/.
    Alors j'ai plusieurs questions, est-ce que mon utilisation de connect et des signaux est correcte ?
    Utiliser un thread pour faire ce traitement pourrait être judicieux ? Si oui, comment bien utiliser les QThreads j'ai vu beaucoup de choses contradictoires sur internet
    Merci pour vos retours et je continue a investiguer de mon côté.
    Cordialement,
    Psykomusic

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur c++ junior
    Inscrit en
    Mai 2013
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur c++ junior
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2013
    Messages : 35
    Par défaut
    Bonjour,
    N'ayant pas trouver de solution avec cette façon de faire j'ai changer radicalement d'idée.
    Afin de résoudre ce problème j'ai utilisé des threads qui lancent des pings. Les signaux sont récupérés et analysés, en fonction de la réponse du ping, mon instance de camera est annoncée comme available ou bien détruite.
    Je me suis beaucoup aidé de cette page de doc : http://doc.qt.io/qt-5/qthread.html et de celle-ci : http://doc.qt.io/qt-4.8/signalsandslots.html qui à mon avis renferment toutes les infos. Cependant je ne comprend toujours pas pourquoi l'utilisation d'un QProcess sans nouveau thread ne fonctionnait pas comme attendu.
    Cordialement,
    Psykomusic

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

Discussions similaires

  1. [WD17] Bloquer la largeur d'une fenêtre sans bloquer sa hauteur
    Par Invité dans le forum WinDev
    Réponses: 2
    Dernier message: 15/12/2012, 11h50
  2. Réponses: 5
    Dernier message: 26/06/2012, 02h42
  3. Afficher un message sans bloquer les autres traitements??
    Par Ben_Le_Cool dans le forum Langage
    Réponses: 7
    Dernier message: 13/10/2005, 00h21
  4. [JFrame] Fermer la fenêtre courante
    Par Invité dans le forum Agents de placement/Fenêtres
    Réponses: 5
    Dernier message: 18/09/2005, 16h47
  5. [API]Comment ne pas bloquer la fenêtre principal...
    Par X-K4l1 dans le forum Windows
    Réponses: 1
    Dernier message: 16/08/2005, 14h10

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