QProcess чтение и запись - PullRequest
       16

QProcess чтение и запись

2 голосов
/ 09 февраля 2011

Я сейчас пытаюсь читать и писать из qprocess. Я сделал небольшую тестовую программу, которая принимает входные данные и отображает их на экране в цикле. Вот мой код из Qt

  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()));

Это не сработает, если я не отправлю последнюю команду выхода (которая завершает мою тестовую программу).

Вот моя команда чтения:

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

если я отправлю quit, я получу все выходные данные программы, включая все, что отправил.

Что я здесь не так делаю?

По запросу, вот код из программы:

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);

    }

}

1 Ответ

1 голос
/ 09 февраля 2011

Из документа:

Некоторые подклассы QIODevice, такие как QTcpSocket и QProcess , являются асинхронными.Это означает, что функции ввода / вывода, такие как write () или read (), всегда возвращаются немедленно, тогда как связь с самим устройством может происходить, когда управление возвращается в цикл обработки событий. QIODevice предоставляет функции, которые позволяют принудительно выполнять эти операции немедленно , блокируя вызывающий поток и не входя в цикл обработки событий.

...

waitForBytesWritten () - Эта функция приостанавливает работу в вызывающем потоке до тех пор, пока на устройство не будет записана одна полезная информация.

...

Вызов этих функций из основного потока GUI может привести кпользовательский интерфейс для замораживания.

ссылка

...