2012-04-03 5 views
0

Diese Frage wird oft gestellt. Viele empfehlen die Verwendung readyReadStandardOutput für diesen Zweck Was ist die beste Art der Implementierung QProcess, die stdout und stderr in "Echtzeit" lesen? Ich möchte Nachrichten in DisplayEdit hinzufügen. Was muss ich in meinem Code ändern (Sie können es unten sehen)? Kann QThread zum Schreiben in DisplayEdit verwendet werden? Ich habe bereits den folgenden Code:Was ist die beste Art der Implementierung Qprocess, die stdout und stderr in "Echtzeit" lesen?

#include "mainwindow.h" 
#include "ui_mainwindow.h" 
#include <QProcess> 
#include <QDebug> 
#include <QCloseEvent> 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    process = new QProcess(this); 
    connect(process, SIGNAL(readyReadStandardOutput()),SLOT(slotDataOnStdout())); 
    connect(process, SIGNAL(readyReadStandardError()), SLOT(slotProcessError())); 
    connect(process, SIGNAL(error(QProcess::ProcessError)),SLOT(slotProcessError())); 
    connect(process, SIGNAL(started()),SLOT(slotProcessStart())); 
    connect(process, SIGNAL(finished(int)),SLOT(slotProcessFinish(int))); 
} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 

void MainWindow::on_EnterButton_clicked() 
{ 
    QStringList args = ui->ArgsEdit->text().split(" "); 
    QString cmd = ui->CommandEdit->text(); 
    process->start(cmd, args); 

} 

void MainWindow::slotDataOnStdout() 
{ 
    qDebug() << "slotDataOnStdout"; 
    ui->DisplayEdit->append(process->readAllStandardOutput() + '\n'); 
} 

void MainWindow::slotStderr() 
{ 
    qDebug() << "std error"; 
} 

void MainWindow::slotProcessError() 
{ 
    qDebug() << "error"; 
} 

void MainWindow::slotProcessStart() 
{ 
    qDebug() << "start"; 
} 

void MainWindow::slotProcessFinish(int exitCode) 
{ 
    qDebug() << "finish: " << exitCode; 
    QString str = process->readAllStandardOutput(); 
    qDebug() << str; 
} 

und ich möchte die Binärdatei von Countdown-Timer execude. Der Code meines Timer (ich habe es von clock reference nimmt:

#include <stdio.h> 
#include <time.h> 

void wait (int seconds) 
{ 
    clock_t endwait; 
    endwait = clock() + seconds * CLOCKS_PER_SEC ; 
    while (clock() < endwait) {} 
} 

int main() 
{ 
    int n; 
    printf ("Starting countdown...\n"); 
    for (n=10; n>0; n--) 
    { 
    printf ("%d\n",n); 
    wait (1); 
    } 
    printf ("FIRE!!!\n"); 
    return 0; 
} 
+0

Es hilft, Ihre Fragen zu trennen, wenn auch nur weil Sie 2 Antworten hier nicht akzeptieren können. – MSalters

Antwort

1

Sieht meistens Recht Sie haben den Prozess zu bereinigen, vergessen, oder darüber nachdenken, was zu tun ist, wenn der Prozess noch nicht abgeschlossen ist

..

Verwenden Sie das QTimer::timeout Signal QTimer::timeout

Verwandte Themen