「Qtの基礎 - プロセス」の版間の差分

提供:MochiuWiki - SUSE, Electronic Circuit, PCB
ナビゲーションに移動 検索に移動
編集の要約なし
3行目: 3行目:
<br><br>
<br><br>


== サンプルコード ==
== 通常のプロセス ==
プロセスを非同期で実行する場合は<code>QProcess::start()</code>、同期して実行する場合は<code>QProcess.execute()</code>を使用する。<br>
プロセスを非同期で実行する場合は<code>QProcess::start()</code>、同期して実行する場合は<code>QProcess.execute()</code>を使用する。<br>
また、非同期で実行する場合、標準出力や標準エラー出力を取得してウィンドウに表示することもできる。<br>
また、非同期で実行する場合、標準出力や標準エラー出力を取得してウィンドウに表示することもできる。<br>
105行目: 105行目:
  }
  }
  </syntaxhighlight>
  </syntaxhighlight>
<br><br>
== 切り離されたプロセス ==
Qt 5.10以降、<code>QProcess</code>クラスを使用して、プロセスを切り離して実行できる。<br>
<br>
<code>QProcess</code>クラスを使用して<u>プロセスを切り離さずに実行する(<code>start</code>メソッドや<code>execute</code>メソッド等)</u>場合、<code>QProcess</code>クラスのデストラクタがプロセスを終了する。<br>
これに対して、切り離されたプロセスは、呼び出したプロセスが終了しても影響を受けずに実行し続ける。<br>
<br>
Linuxでは、切り離されたプロセスは独自のセッションで実行されて、デーモンのように動作する。<br>
<br>
切り離されたプロセスを実行するには、<code>QProcess::startDetached</code>メソッドを使用する。<br>
<br>
以下の例では、<code>aplay</code>コマンドを使用して、Sample.wavを再生している。<br>
<syntaxhighlight lang="c++">
QProcess::startDetached("aplay Sample.wav");
</syntaxhighlight>
<br>
通常のプロセスと同様に、複数の引数と作業ディレクトリを渡すことができる。<br>
また、開始されたプロセスの<code>PID</code>を取得することができる。<br>
<syntaxhighlight lang="c++">
// プロセスの開始
qint64 pid;
QProcess::startDetached("mpg123", {"Sample.mp3", <引数2>, <引数3>, ...}, musicDirPath, &pid);
// ...略
</syntaxhighlight>
<br>
<code>QProcess::startDetached</code>メソッドで取得した<code>PID</code>を使用して、プロセスを<code>kill</code>することもできる。<br>
<syntaxhighlight lang="c++">
// プロセスの終了
QProcess::startDetached("kill", {QString::number(pid)});
</syntaxhighlight>
<br>
切り離されたプロセスを実行するにあたり、プロセスの出力を制御することもできる。<br>
(使用するコマンドの中には、<code>--quiet</code>オプションが存在するものもある)<br>
# プロセス環境を設定する。
# <code>stdin</code>、<code>stdout</code>、<code>stderr</code>をファイルにリダイレクトする。
# ネイティブな引数を設定、および、切り離されたプロセス用の<code>CreateProcess</code>関数(Windows API)の引数の設定
<br>
ただし、<code>static</code>な<code>startDetached</code>メソッドではなく、<code>非static</code>な<code>QProcess</code>クラスの<code>startDetached</code>メソッドを使用する必要がある。<br>
これは、<code>QProcess</code>オブジェクトのプロパティを読み込み、それに応じて切り離されたプロセスを開始する。<br>
<br>
以下の例では、<code>mpg123</code>コマンドを使用して、Sample.mp3を再生している。<br>
<code>/dev/null</code>へのリダイレクトは、ユーザがオーディオプレーヤの視覚的な出力を非表示にしている。<br>
<syntaxhighlight lang="c++">
QProcess process;
process.setProgram("mpg123");
process.setArguments({"Sample.mp3"});
process.setWorkingDirectory(musicDirPath);  // 例. ファイルが存在するディレクトリのパス(/home/hpge/music等)
process.setStandardOutputFile(QProcess::nullDevice());  // /dev/nullへのリダイレクト
process.setStandardErrorFile(QProcess::nullDevice());  // /dev/nullへのリダイレクト
qint64 pid;
process.startDetached(&pid);
// ...略
</syntaxhighlight>
<br>
以下に、<code>startDetached</code>メソッドでサポートされているサブセットを示す。<br>
<u>サブセットを使用する場合、<code>QProcess</code>クラスの他の全てのプロパティは無視されることに注意すること。</u><br>
* <code>setArguments</code>メソッド
* <code>setCreateProcessArgumentsModifier</code>メソッド
* <code>setNativeArguments</code>メソッド
* <code>setProcessEnvironment</code>メソッド
* <code>setProgram</code>メソッド
* <code>setStandardErrorFile</code>メソッド
* <code>setStandardInputFile</code>メソッド
* <code>setStandardOutputFile</code>メソッド
* <code>setWorkingDirectory</code>メソッド
<br><br>
<br><br>


__FORCETOC__
__FORCETOC__
[[カテゴリ:Qt]]
[[カテゴリ:Qt]]

2021年10月16日 (土) 14:54時点における版

概要

Qtにおいて、QProcessクラスを使用して、プロセスを制御する手順を記載する。


通常のプロセス

プロセスを非同期で実行する場合はQProcess::start()、同期して実行する場合はQProcess.execute()を使用する。
また、非同期で実行する場合、標準出力や標準エラー出力を取得してウィンドウに表示することもできる。

以下の例は、プロセスを非同期で実行して、プロセスの標準出力と標準エラー出力をウィンドウに表示している。

 // MainWindow.h
 
 #ifndef MAINWINDOW_H
 #define MAINWINDOW_H
 
 #include <QMainWindow>
 #include <QProcess>
 
 QT_BEGIN_NAMESPACE
 namespace Ui { class MainWindow; }
 QT_END_NAMESPACE
 
 class MainWindow : public QMainWindow
 {
    Q_OBJECT
 
 private:
    QProcess m_proc;
  
 public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
 
 private slots:
    // プロセス用のスロット
    void ProcessFinished(int exitCode, QProcess::ExitStatus exitStatus);
    void UpdateOutput();
    void UpdateError();
 };
 #endif // MAINWINDOW_H


 // MainWindow.cpp
 
 #include <QApplication>
 #include <QProcess>
 #include "Mainwindow.h"
 #include "ui_Mainwindow.h"
 
 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
 {
    ui->setupUi(this);
 
    // プロセス用のシグナルとスロットを接続する
    QObject::connect(&m_proc, SIGNAL(readyReadStandardOutput()), this, SLOT(UpdateOutput()));
    QObject::connect(&m_proc, SIGNAL(readyReadStandardError()), this, SLOT(UpdateError()));
    QObject::connect(&m_proc, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(ProcessFinished(int, QProcess::ExitStatus)));
 }
 
 MainWindow::~MainWindow()
 {
    delete ui;
 }
 
 // スロット : 標準出力を表示する
 void MainWindow::UpdateOutput()
 {
    // 標準出力を取得して文字列にする
    QByteArray output = m_proc.readAllStandardOutput();
    QString str = QString::fromLocal8Bit(output);
 }
 
 // スロット : 標準エラー出力を表示する
 void MainWindow::UpdateError()
 {
    // 標準エラー出力を取得して文字列にする
    QByteArray output = m_proc.readAllStandardError();
    QString str = QString::fromLocal8Bit(output);
 }
 
 // スロット : プロセス終了時
 void MainWindow::ProcessFinished(int exitCode, QProcess::ExitStatus exitStatus)
 {
    if(exitStatus == QProcess::CrashExit)
    {
       QMessageBox::warning(this, tr("Error"), tr("Crashed"));
    }
    else if(exitCode != 0)
    {
       QMessageBox::warning(this, tr("Error"), tr("Failed"));
    }
    else
    {  // 正常終了時の処理
    }
 }
 
 // プロセスの起動
 void MainWindow::ProcessStart()
 {
    QStringList strlArgs;
    listArgs << "<引数1>" << "<引数2>";
 
    m_proc.start("<実行するプログラムのパス>", listArgs);
 }



切り離されたプロセス

Qt 5.10以降、QProcessクラスを使用して、プロセスを切り離して実行できる。

QProcessクラスを使用してプロセスを切り離さずに実行する(startメソッドやexecuteメソッド等)場合、QProcessクラスのデストラクタがプロセスを終了する。
これに対して、切り離されたプロセスは、呼び出したプロセスが終了しても影響を受けずに実行し続ける。

Linuxでは、切り離されたプロセスは独自のセッションで実行されて、デーモンのように動作する。

切り離されたプロセスを実行するには、QProcess::startDetachedメソッドを使用する。

以下の例では、aplayコマンドを使用して、Sample.wavを再生している。

 QProcess::startDetached("aplay Sample.wav");


通常のプロセスと同様に、複数の引数と作業ディレクトリを渡すことができる。
また、開始されたプロセスのPIDを取得することができる。

 // プロセスの開始
 qint64 pid;
 QProcess::startDetached("mpg123", {"Sample.mp3", <引数2>, <引数3>, ...}, musicDirPath, &pid);
 // ...略


QProcess::startDetachedメソッドで取得したPIDを使用して、プロセスをkillすることもできる。

 // プロセスの終了
 QProcess::startDetached("kill", {QString::number(pid)});


切り離されたプロセスを実行するにあたり、プロセスの出力を制御することもできる。
(使用するコマンドの中には、--quietオプションが存在するものもある)

  1. プロセス環境を設定する。
  2. stdinstdoutstderrをファイルにリダイレクトする。
  3. ネイティブな引数を設定、および、切り離されたプロセス用のCreateProcess関数(Windows API)の引数の設定


ただし、staticstartDetachedメソッドではなく、非staticQProcessクラスのstartDetachedメソッドを使用する必要がある。
これは、QProcessオブジェクトのプロパティを読み込み、それに応じて切り離されたプロセスを開始する。

以下の例では、mpg123コマンドを使用して、Sample.mp3を再生している。
/dev/nullへのリダイレクトは、ユーザがオーディオプレーヤの視覚的な出力を非表示にしている。

 QProcess process;
 
 process.setProgram("mpg123");
 process.setArguments({"Sample.mp3"});
 process.setWorkingDirectory(musicDirPath);  // 例. ファイルが存在するディレクトリのパス(/home/hpge/music等)
 
 process.setStandardOutputFile(QProcess::nullDevice());  // /dev/nullへのリダイレクト
 process.setStandardErrorFile(QProcess::nullDevice());   // /dev/nullへのリダイレクト
 
 qint64 pid;
 process.startDetached(&pid);
 
 // ...略


以下に、startDetachedメソッドでサポートされているサブセットを示す。
サブセットを使用する場合、QProcessクラスの他の全てのプロパティは無視されることに注意すること。

  • setArgumentsメソッド
  • setCreateProcessArgumentsModifierメソッド
  • setNativeArgumentsメソッド
  • setProcessEnvironmentメソッド
  • setProgramメソッド
  • setStandardErrorFileメソッド
  • setStandardInputFileメソッド
  • setStandardOutputFileメソッド
  • setWorkingDirectoryメソッド