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 :

ihm stdin et QProcess


Sujet :

Qt

  1. #1
    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 ihm stdin et QProcess
    Salut.
    J'ai un problème que j'ai du mal à capter.
    Je créé une ihm qui li stdin dans un thread.
    Normalement jusqu'ici tout va bien. D'après les recherche que j'ai faite, il n'y as pas d'autre moyen. Ça marche.
    Sauf si c'est un process enfant
    Si je lance cette appli dans un process enfant, la lecture du stdin bloque l'ihm, et ceci uniquement au tout début. Après ça marche nickel. Et encore plus fort, ça dépend des machine
    Si quelqu'un à une idée
    Qt 4.5
    visual 2005

    j'ai eu un problème similaire avec une appli gtk en process enfant. Qt 4.4 et visual 2005


    voici un code d'exemple.Un petit chat entre process. ATTENTION il faut compiler avec le mode console :
    CONFIG += console
    dans le .pro

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    #include <QtGui>
    #include <iostream>
    #include  	<io.h>
    #include <fcntl.h>
    static QString getCin()
    {
        std::string s;
        std::getline(std::cin,s);
        return QString::fromStdString(s);
    }
    class myWidget : public QWidget
    {
        Q_OBJECT
        QLineEdit * lineEdit;
        QTextBrowser * browser;
        QFutureWatcher<QString> watcher;
        QProcess myProcess;
        bool childProcess;
    public:
        myWidget(bool b)
        :childProcess(b)
        {
            QVBoxLayout * l = new QVBoxLayout(this);
            lineEdit = new QLineEdit;
            browser = new QTextBrowser;
            l->addWidget(lineEdit);
            l->addWidget(browser);
            if (childProcess)
            {
                setWindowTitle("child process");
                connect(lineEdit,SIGNAL(returnPressed ()),this,SLOT(sendTostdout()));
            }
            else
            {
                setWindowTitle("parent process");
                connect(&myProcess,SIGNAL(readyReadStandardOutput ()),this,SLOT(processend()));
                connect(lineEdit,SIGNAL(returnPressed ()),this,SLOT(sendToProcess()));
                QStringList args;
                args<<"s";
                QString s = QCoreApplication::applicationFilePath () ;
                myProcess.start(QCoreApplication::applicationFilePath () ,args);
            }
     
            connect(&watcher,SIGNAL(finished ()),this,SLOT(watcherend()));
            QTimer::singleShot(0,this,SLOT(launchFuture()));
        }
     
    public slots:
        void launchFuture()
        {
            watcher.setFuture(QtConcurrent::run(getCin));
        }
        void watcherend()
        {
            browser->append(watcher.result());
            watcher.setFuture(QtConcurrent::run(getCin));
        }
        void sendTostdout()
        {
            std::cout<<lineEdit->text().toStdString()<<std::endl;
            fflush(stdout);
        }
        void processend()
        {
             browser->append(myProcess.readAllStandardOutput());
        }
        void sendToProcess()
        {
            myProcess.write(lineEdit->text().toLocal8Bit());
            myProcess.putChar('\n');
        }
     
     
    };
     
    #include "main.moc"
    int main(int argc, char **argv) {
        QApplication app(argc, argv);
        myWidget w (argc > 1);
        w.show();
        return app.exec();
    }
    ps : chez moi, l'ihm se bloque au premier déplacement de la fenêtre du process enfant.

  2. #2
    Membre Expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Par défaut
    Salut,

    Sur mon install (Qt 4.4.3 / VC++2008 express), pas de soucis comme tu l'indiques :s (si ce n'est un message lors de la fermeture "QProcess: Destroyed while process is still running.")
    Tu as trouvé un dénominateur commun sur les machines qui freezent ? Qu'entends-tu par "et ceci uniquement au tout début. Après ça marche nickel." ?

  3. #3
    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
    Oups j'ai zappé de mettre la réponse
    Citation Envoyé par IrmatDen Voir le message
    Sur mon install (Qt 4.4.3 / VC++2008 express), pas de soucis comme tu l'indiques :s (si ce n'est un message lors de la fermeture "QProcess: Destroyed while process is still running.")
    oui il est pas parfait surtout que je ne sais pas si je peut tuer la thread du QtConcurrent qui se trouve bloqué

    Tu as trouvé un dénominateur commun sur les machines qui freezent ?
    La réponse est simple : bug de windows Xp
    En tout cas c'est le retour de QtSoftware. Sous vista normalement aucun problème
    Et cela explique mon problème similaire avec une applie gtk.

    Qu'entends-tu par "et ceci uniquement au tout début. Après ça marche nickel." ?
    *je lance l'appli.
    *je cherche à déplacer pour la première fois la fenêtre du process enfant => freeze de cette fenêtre. Semble t'il bloqué par le getline.
    *j'envoie un message avec la fenêtre du process parent => le process enfant lit le message et se débloque.
    *tout marche nikel par la suite

    Après la réponse de QtSoftware, j'ai contourné mon problème avec QLocalServer et QLocalSoket.

  4. #4
    Membre Expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Par défaut
    Violent comme bug O_o

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

Discussions similaires

  1. [SWT]mise a jour ihm SWT par un thread
    Par will82 dans le forum SWT/JFace
    Réponses: 1
    Dernier message: 06/08/2004, 11h37
  2. [IHM] Enchainement des écrans
    Par CanardJM dans le forum Composants VCL
    Réponses: 6
    Dernier message: 22/06/2004, 16h01
  3. fflush(stdin)
    Par lestat dans le forum C
    Réponses: 9
    Dernier message: 23/03/2004, 11h46
  4. fflush(stdin)
    Par BURZUM dans le forum C
    Réponses: 2
    Dernier message: 06/01/2004, 10h59
  5. descripteur stdin stdout
    Par discogarden dans le forum Réseau
    Réponses: 10
    Dernier message: 08/01/2003, 23h25

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