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

Qt Discussion :

Qtimer et QProcess


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 69
    Par défaut Qtimer et QProcess
    Bonjour, j'ai besoin d'appeler un exécutable (qui sert a récupérer une image d'une caméra) toutes les secondes depuis mon application qt quand un certain bouton est appuyé. Tout à l'air de bien se passer mais ça plante parfois. Je voulais être sur que que c'était surement pas l'appli qt qui merdouille...

    Dans le constructeur de maWidget :
    timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(update()));

    slot du bouton...
    void maWidget::buttonClicked() {
    if (!isOn) {
    isOn = true;
    timer->start(1000);
    } else {
    isOn = false;
    timer->stop();
    }
    }
    slot appelé à chaque timeout de timer
    void maWidget::update() {
    QString program = "programme.exe";
    QStringList arguments;
    QProcess *myProcess = new QProcess(0);
    myProcess->start(program, arguments);
    label->setPixmap(QPixmap("image.jpg").scaled(176, 144));
    }
    1)
    timer->start(1000);
    veut bien dire que les "ticks" ont lieu toutes les 1000ms ?? (je croyais que c'était setInterval au début...)

    2)
    myProcess->start(program, arguments);
    label->setPixmap(QPixmap("image.jpg").scaled(176, 144));
    la 2 ème ligne est bien appelée quand myProcess se termine ou bien l'appli fork et myProcess et la 2ème ligne s'exécutent en même temps ?

    Merci d'avance !

  2. #2
    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
    Salut,

    Deja, il y a sans doute quelques infos dans la faq, notamment si tu veux démarrer dans un thread parallèle ou alors rendre l'éxécution de ton process bloquante.
    http://qt.developpez.com/faq/?page=q...ir_application

    ça plante parfois.
    On peut avoir des détails ?
    Citation:
    timer->start(1000);

    veut bien dire que les "ticks" ont lieu toutes les 1000ms ?? (je croyais que c'était setInterval au début...)
    Oui, en fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    timer->start(1000);
    //est équivalent à
    timer->setInterval(1000);
    timer->start();
    Citation:
    myProcess->start(program, arguments);
    label->setPixmap(QPixmap("image.jpg").scaled(176, 144));

    la 2 ème ligne est bien appelée quand myProcess se termine ou bien l'appli fork et myProcess et la 2ème ligne s'exécutent en même temps ?
    Comme renseigné dans la FAQ, les 2 sont possibles. A toi de choisir lequel tu veux. Sinon, es tu bien sûr que ton "programme.exe" se termine bien à chaque fois ? Car si tu le lances toutes les secondes et qu'il merde à la fermeture, ça va te créer des ennuis.

    Pense à bien vérifier que tes process et ton timer sont arrêtés quand ils doivent l'être.

    G.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 69
    Par défaut
    1) Bien compris pour le timer ! Avant je faisais setInterval(1000) puis start(0) et je ne comprenais pas pourquoi j'entendais le ventilateur se mettre en route

    2) Si je comprends bien la doc trolltech, QProcess::start n'est pas bloquant alors que QProcess::execute l'est ?? (ce n'est pas très clair dans la FAQ). Dans ce cas c'est QProcess::execute qu'il me faut.

    3)
    Citation Envoyé par Gulish Voir le message
    On peut avoir des détails ?
    Mon appli qt appelle un programme intermédiaire pour obtenir l'image d'une webcam distante puis affiche l'image obtenue d'où le
    myProcess->start(program, arguments);
    label->setPixmap(QPixmap("image.jpg").scaled(176, 144));
    . Il se trouve que le programme intermédiaire fait un petit seg fault de temps en temps. Ce ne serait pas si dérangeant si une alert Windows n'apparaissait pas par dessus mon appli qt pour me le faire savoir. La cause de l'erreur pourrait être que l'appli qt cherche a lire l'image tandis que le programme intermédiaire cherche à écrire dessus. C'est pour ça qu'il faut que je sois sur que j'essaie d'afficher l'image quand ce dernier a fini de s'exécuter. De plus j'ai tenté d'implémenter un mutex dans le slot update malgré timer->start(1000); car je ne sais par combien de temps prendra la transmission wifi de l'image pour s'éxécuter.
    void maWidget::update() {
    if (isBusy == true)
    return;
    isBusy = true;
    QString program = "programme.exe";
    QStringList arguments;
    QProcess *myProcess = new QProcess(0);
    myProcess->start(program, arguments);
    label->setPixmap(QPixmap("image.jpg").scaled(176, 144));
    isBusy = false;
    }

  4. #4
    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
    Salut,

    Au lieu de faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    QProcess *myProcess = new QProcess(0);
    myProcess->start(program, arguments);
    label->setPixmap(QPixmap("image.jpg").scaled(176, 144));
    et de prier pour que l'image soit là à temps , il existe ce signal :
    void QProcess::finished ( int exitCode, QProcess::ExitStatus exitStatus ) [signal]
    This signal is emitted when the process finishes. exitCode is the exit code of the process, and exitStatus is the exit status. After the process has finished, the buffers in QProcess are still intact. You can still read any data that the process may have written before it finished.

    See also exitStatus().
    Il te suffit de le connecter à un slot qui affiche ton image, si le code de retour est bon par exemple, ou d'afficher une notification d'erreur de lecture si ton programme s'est mal éxécuté.

    Après, si la transmission Wi-fi de ton image n'est pas comprise dans l'éxécution de ton programme annexe, ça peut poser problème, dans ce cas, tu pourrais ajouter un petit delay avant la lecture effective de l'image. Ou alors, plus archaïquement, tu pourrais faire des tests sur ton fichier (est ce qu'il fait la bonne taille, est ce qu'il est possible de l'ouvrir avec QFile, etc...)

    Bonne chance,

    G.

  5. #5
    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.
    attention, quand tu fait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void maWidget::update() {
    ...
    QProcess *myProcess = new QProcess(0);
    myProcess->start(program, arguments);
    label->setPixmap(QPixmap("image.jpg").scaled(176, 144));
    isBusy = false;
    }
    1- à chaque update tu créé un QProcess qui n'est jamais détruit => fuite mémoire
    2- tu n'as aucune attente de fin de programm => il doit arriver des moment ou tu lie l'image pendant que ton process l'écrit (mais ca on te l'as déjà ecrit).


    Pour moi trois solution comme tu as une ihm :
    1- un thread qui à temps régulier va executer ton process avec la fonction static QProcess::execute et émettre un signal avec l'image
    http://qt.developpez.com/doc/4.4/qprocess/#execute

    2- la méthode de gulish. Tu n'utilise qu'un process et tu te sert du signal finished

    3- es tu obliger d'utiliser un exe externe?

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

Discussions similaires

  1. [Linux-Qt4.4]QProcess ne se termine pas!
    Par crtx_omar dans le forum Qt
    Réponses: 2
    Dernier message: 27/08/2008, 10h28
  2. Qt Problème avec un QTimer
    Par U118gs dans le forum Qt
    Réponses: 3
    Dernier message: 22/08/2008, 09h28
  3. Exemple QProcess FAQ: aide compréhension
    Par Nykoo dans le forum Qt
    Réponses: 9
    Dernier message: 01/04/2008, 00h28
  4. [QThread] QProcess et QSemaphore
    Par slymira dans le forum Multithreading
    Réponses: 11
    Dernier message: 29/11/2007, 11h40
  5. Réponses: 8
    Dernier message: 21/12/2006, 21h03

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