چطور میتوان از آبجکت QProcess به صورت بلادرنگ خروجی گرفت - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

چطور میتوان از آبجکت QProcess به صورت بلادرنگ خروجی گرفت

0 امتیاز
با سلام

من از QProcess برای اجرای دستور پینگ استفاده کرده

اما برنامه من الان منتظر میمونه تا پینگ کامل اجرا شه و بعد کل خروجی رو نشون میده

حالا سوال من اینه: آیا روشی هست که بتونم خط به خط خروجی رو به محظ اینکه تولید میشه بخونم؟ یعنی هر جواب پینگ که اومد بخونمش؟

 

من از تابع waitForFinished و readAll استفاده میکنم

آیا کسی میتونه منو راهنمایی کنه؟

با تشکر
سوال شده اردیبهشت 13, 1393  بوسیله ی mehmir (امتیاز 36)   2 3 6

1 پاسخ

+1 امتیاز

سلام از QThread استفاده کن

برای خط به خط هم از SIGNAL

readyRead داخل QProcess

مثلا این کلاس که من  برای گرفتن پینگ نوشتم :

//ProcessThread.h
#ifndef PROCESSTHREAD_H
#define PROCESSTHREAD_H
#include <QThread>
#include <QProcess>
#include <QObject>

class ProcessThread : public QThread
{
    Q_OBJECT
public:
    ProcessThread()
    {
        proc =NULL;
    }

    void run()
    {
        if(proc ==NULL)
            proc=new QProcess;
        connect(proc,SIGNAL(readyRead()),this,SLOT(pingReady()));
        QStringList arguments = QStringList() << "google.com";
        proc->start("ping",arguments,QIODevice::ReadOnly);
        proc->waitForFinished();
    }

    ~ProcessThread()
    {
        delete proc;
    }

signals:
    void resultReady(QString);
private slots:
    void pingReady()
    {
        if(!proc->isOpen())
            return;
        QString res=proc->readAllStandardOutput();
        emit resultReady(res);
    }
private:
    QProcess *proc;
};
#endif // PROCESSTHREAD_H

 

اینم یک مثال از نحوه استفاده از کلاس بالا :(فرض کردم یک QTextBrower با اسم textBrower داخل فرم هست)

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "ProcessThread.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ProcessThread *thread=new ProcessThread;
    QObject::connect(thread,SIGNAL(resultReady(QString)),this,SLOT(pingFinish(QString)));
    thread->start();
}

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

void MainWindow::pingFinish(QString res)
{
    ui->textBrowser->append(res);
}

ضمنا از کلاس های QABstracktSocket هم میتونی استفاده کنی و پینگ رو خودت بنویسی .

پاسخ داده شده اردیبهشت 13, 1393 بوسیله ی BlueBlade (امتیاز 15,315)   15 18 89
دانلود برنامه بالا : https://www.mediafire.com/?ycnd04f2ffxmop2
...