Задать вопрос
@luzhskij
geo c++

Как запустить system с нюансами?

Благодаря предыдущему вопросу стало понятно (спасибо Армянское Радио ), что передать команду из кода в консоль можно при помощи system();.
И теперь возникает новый интерес! А как отследить выполнение процесса, который мы порождаем из кода.
И как запустить выполнение в фоновом режиме?
  • Вопрос задан
  • 2413 просмотров
Подписаться 4 Оценить Комментировать
Решения вопроса 1
gbg
@gbg Куратор тега C++
Любые ответы на любые вопросы
QProcess все сделает, вот небольшой пример:

PingerWindow.h:
#ifndef PINGERWINDOW_H
#define PINGERWINDOW_H

#include <QMainWindow>
#include <QProcess>

namespace Ui {
class PingerWindow;
}

class PingerWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit PingerWindow(QWidget *parent = 0);
    QProcess ping;
    ~PingerWindow();

private:
    Ui::PingerWindow *ui;

public slots:
    void readyRead();
    void changeHost();
    void stop();
    void enaStop();
    void disaStop(int code);
};

#endif // PINGERWINDOW_H


PingerWindow.cpp:
#include "pingerwindow.h"
#include "ui_pingerwindow.h"

PingerWindow::PingerWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::PingerWindow)
{
    ui->setupUi(this);
    //Запуск процесса в фоне
    ping.start("ping 127.0.0.1");
    //Привязываем сигналы от кнопок

    connect(ui->pingButton,SIGNAL(clicked()),this,SLOT(changeHost()));
    connect(ui->stopButton,SIGNAL(clicked()),this,SLOT(stop()));
    //Привязываем сигналы от процесса
    connect(&ping,SIGNAL(readyRead()),this,SLOT(readyRead()));   //процесс что-то написал в свой stdout
    connect(&ping,SIGNAL(started()),this,SLOT(enaStop()));       //процесс запустился
    connect(&ping,SIGNAL(finished(int)),this,SLOT(disaStop(int))); //процесс звершил работу

}

PingerWindow::~PingerWindow()
{
    stop();
    delete ui;
}

void PingerWindow::readyRead()
{
    //обработка сигнала о приходе новых данных - вывод их в окно
    ui->pingerOut->appendPlainText(ping.readAll().data());
}

void PingerWindow::changeHost()
{
    //обработка сигнала о необходимости сменить хост
    stop(); //стоп процесса
    ping.start(QString("ping \"%1\"").arg(ui->hostname->text())); //запуск нового процесса
}

void PingerWindow::stop()
{
    //остановка процесса
    if(ping.isOpen())         //если процесс открыт
    {
        ping.terminate();     //прекращаем его
        ping.waitForFinished();   //ждем прекращения
    }
}

void PingerWindow::enaStop()
{
    //делаем кнопку остановки доступной, если процесс запустился
    ui->stopButton->setEnabled(true);
}

void PingerWindow::disaStop(int code)
{
    //после остановки процесса, выводим код возврата в окно
    ui->pingerOut->appendHtml(QString("<i>Return code is %1</i>").arg(code));
    //делаем кнопку остановки недоступной
    ui->stopButton->setDisabled(true);
}


Он же на гитхабе
Пример запускает программу ping и позволяет управлять ей.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Koss1024
1. Отследить можно по коду возврата функции system это и будет тот самый return который в main написан 1

2. на С++ 11 породить поток можно для система
в С++ 03 std::system("start command") // под винду

Общим решением будет использовать кросплатформенную либу
boost::process
boost::filesystem
вам помогут
Ответ написан
@DancingOnWater
QProcess
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы