「Qtの基礎 - プロセス」の版間の差分
編集の要約なし |
|||
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
オプションが存在するものもある)
- プロセス環境を設定する。
stdin
、stdout
、stderr
をファイルにリダイレクトする。- ネイティブな引数を設定、および、切り離されたプロセス用の
CreateProcess
関数(Windows API)の引数の設定
ただし、static
なstartDetached
メソッドではなく、非static
なQProcess
クラスの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
メソッド