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

Я пытаюсь читать и писать из 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()));

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

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

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

    }

}

person Bobak Hashemi    schedule 09.02.2011    source источник


Ответы (1)


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

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

...

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

...

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

ссылка

person ctd    schedule 09.02.2011
comment
да, но я ловлю сигнал, так что не думаю, что это имеет значение. Но может я плохо в этом разбираюсь. Несмотря на это, я добавил tcd-›waitForBytesWritten(); в моем коде, и все еще ничего. Редактировать: у меня есть кнопка, которая отправляет ввод в мой код, так что после того, как сигнал инициирован, все еще ничего. - person Bobak Hashemi; 09.02.2011