Salut , j'ai lance un script matlab depuis qt creator a l'aide de la classe Qprocess le script il s’exécute bien , mais je veux a la fin récupérer le résultat de script , existe-t-il une méthode pour récupérer le résultat de script ??
Salut , j'ai lance un script matlab depuis qt creator a l'aide de la classe Qprocess le script il s’exécute bien , mais je veux a la fin récupérer le résultat de script , existe-t-il une méthode pour récupérer le résultat de script ??
Tout dépend quelle est la sortie de ton script. Sortie standard, sortie d'erreur, un fichier ?
Tu peux récupérer la sortie standard avec la fonction QByteArray QProcess::readAllStandardOutput()
je pense c'est un sortie standard puisque le script fais des calcules et donne a la fin le résultat , j'ai déjà utilise la fonction readAllStandardOutput() ms j'arrive pas a l'afficher pour tester est ce que la valeur retourne exacte ou non , pour le moment je cherche comment vérifie le résultat de readAllStandardOutput()
Pour afficher du contenu tu peux utiliser qDebug().
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 qDebug() << "Sortie du script :"; qDebug() << processObject->readAllStandardOutput();
j'ai deja le tester mais il s'affiche seulement :
Sortie du script :
Pourrais-tu nous montrer le code que tu utilises pour exécuter le script MATLAB via QProcess ?
voila le code :
j'ai aussi essaye d'utiliser signal readyReadStandardOutput() et faire le connecte avec slot mais lorsque je fais la connection le programme plante et donne juste fenetre noir avec l'erreur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 myprocess = new QProcess(this); myprocess->setProcessChannelMode(QProcess::MergedChannels); QString program = "C:\\Program Files (x86)\\MATLAB\\R2013a\\bin\\matlab.exe"; myprocess->start(program, QStringList() << QString("-nodisplay") << QString("-nodesktop") << QString("-nosplash") <<QString("-r") <<QString("run('C:/Users/Documents/gui/gui/test.m');"),QIODevice::ReadOnly); myprocess->waitForFinished();
voila code de connection :the inferior stopped because it received a signal from the operating system qt sigsegv
et le slot affiche :
Code : Sélectionner tout - Visualiser dans une fenêtre à part MaFenetre::connect(myprocess,SIGNAL(readyReadStandardOutput()),this,SLOT(affiche));
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 void MaFenetre::affiche(){ qDebug()<< "sortie est :"; qDebug()<< myprocess->readAllStandardOutput(); }
Le plus simple consiste à enregistrer les résultats du code MATLAB dans un fichier et lire ce fichier depuis le code initiale après que le process MATLAB se soit arrêté.
Montre nous le code MATLAB contenu dans test.m
je teste pour le moment juste un petit exemple:
je sais pas comment enregistrer le résultat de script dans un fichier puisque j'utilise pas beaucoup matlab et comment je peux savoir que le processus matlab termine pour lire le résultat
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 A = [23 42 37 15 52]; M = min(A)
Il existe des fonctions relativement simples à comprendre et à utiliser comme la fonction dlmwrite (Voir la FAQ : Quelles sont les fonctions de lecture et écriture ?)
Code MATLAB : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 A = [23 42 37 15 52]; M = min(A); dlmwrite('test.txt', M)
Je ne connais pas Qt mais je pense que c'est ce que fait la ligne myprocess->waitForFinished();, non ?
Au passage, je changerais quelque peu la commande :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 myprocess = new QProcess(this); myprocess->setProcessChannelMode(QProcess::MergedChannels); QString program = "C:\\Program Files (x86)\\MATLAB\\R2013a\\bin\\matlab.exe"; myprocess->start(program, QStringList() << QString("-nodisplay") << QString("-nodesktop") << QString("-nosplash") <<QString("-r") <<QString("cd('C:/Users/Documents/gui/gui/');run('test');exit"),QIODevice::ReadOnly); myprocess->waitForFinished();
merci beaucoup la commande matlab ca marche il souvegarde le resultat dans le fichier il me reste juste lire le fichier je vais essayer de lire apres fin d'execution de processus matlab
Petite note supplémentaire : pour éviter de bloquer ton interface pendant l'exécution du processus MATLAB, il vaut mieux utiliser le système de signaux et de slots : plus précisément, utilise le signal QProcess::finished http://doc.qt.io/qt-5/qprocess.html#finished et connecte-le au code qui lit les résultats.
salut même j'utilise le signal QProcess::finished la lecture de donnes se fait avant de terminer l’exécution de script matlab
script matlab :
connection signal slot :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 A = [23 42 37 15 52]; M = min(A) dlmwrite('test.txt', M)
slot lire() :
Code : Sélectionner tout - Visualiser dans une fenêtre à part MaFenetre::connect(myprocess,SIGNAL(finished(int)),this,SLOT(lire()));
le problème que la lecture se fait avant de terminer l’exécution de script il s'afficher l'ancien résultat et jusqu’à maintenant j'ai pas trouve une autre solution
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 void MaFenetre::lire(){ std::ifstream file("test.txt"); if (file) { std::string X ; file >> X ; std::cout << "la valeur de sortie vaut :" << X <<"\n"<< endl; } }
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager