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 QProcessC'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 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; }
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 :/.
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); }
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
Partager