2011-02-09 4 views
2

J'essaie de lire et d'écrire à partir d'un processus q maintenant. J'ai fait un petit programme de test qui prend l'entrée et la réaffiche sur l'écran en boucle. Voici mon code de QtQProcess lire et écrire

QString path = "./test"; 

     tcd = new QProcess(this); 
     QStringList args; 
     args << ""; 
     tcd->start(path,args); 

     if(!tcd->waitForStarted(3000)) 
     { 
      stdoutput->append("<h1><font color=red>There was a problem starting the software, please try running the program again.</font></h1>"); 

     } 
     tcd->write("hello\n"); 
     tcd->write("hello\n"); 
     tcd->write("hello\n"); 
     tcd->write("hello\n"); 
     //tcd->write("quit\n"); 

QObject::connect(tcd, SIGNAL(readyReadStandardOutput()), this, SLOT(appendTextBox())); 

Cela ne fonctionnera pas à moins que j'envoie cette dernière commande quit (qui met fin à mon programme de test).

Voici mon ordre de lecture:

void TCD2_GUI::appendTextBox(){ 
    stdoutput->append("new output available: \n"); 
    QByteArray newData = tcd->readAllStandardOutput(); 
    stdoutput->append(QString::fromLocal8Bit(newData)); 
} 

si j'envoie Quit, je vais obtenir toutes les sorties du programme à la fois, y compris tout ce que je l'ai envoyé.

Qu'est-ce que je fais mal ici?

selon la demande, voici le code du programme:

int main(int argC[], char* argV[]){ 
    printf("Welcome!\n"); 
    char* input = malloc(160); 
    gets(input); 

    while(strcmp(input,"quit") != 0) 
    { 
     printf("Got input %s\n", input); 
     gets(input); 

    } 

} 

Répondre

1

De la doc:

Certaines sous-classes de QIODevice, tels comme QTcpSocket et QProcess, sont asynchrones . Cela signifie que les fonctions I/O telles que write() ou read() reviennent toujours immédiatement, tandis que la communication avec le périphérique lui-même peut se produire lorsque le contrôle revient à la boucle d'événements. QIODevice fournit des fonctions qui vous permettent de forcer ces opérations à effectuer immédiatement , tout en bloquant le thread appelant et sans entrer la boucle d'événements.

...

waitForBytesWritten() - Cette fonction suspend le fonctionnement dans le fil appeler jusqu'à ce qu'une charge utile des données a été écrit à l'appareil.

...

appel de ces fonctions du principal, fil GUI , peut entraîner votre interface utilisateur de geler.

link

+0

oui, mais je suis signal de capture, donc je ne pense pas que si la matière. Mais peut-être que j'ai une mauvaise compréhension de cela. Peu importe, je mets un tcd-> waitForBytesWritten(); dans mon code, et toujours rien .. Edit: J'ai un bouton qui envoie une entrée dans mon code, donc c'est après le signal est lancé, toujours rien. –