mirror of
https://github.com/MatsuriDayo/nekoray.git
synced 2025-12-17 20:44:38 +03:00
upload code
This commit is contained in:
70
sys/ExternalProcess.cpp
Normal file
70
sys/ExternalProcess.cpp
Normal file
@@ -0,0 +1,70 @@
|
||||
#include "ExternalProcess.hpp"
|
||||
|
||||
namespace NekoRay::sys {
|
||||
ExternalProcess::ExternalProcess(const QString &tag,
|
||||
const QString &program,
|
||||
const QStringList &arguments,
|
||||
const QStringList &env)
|
||||
: QProcess() {
|
||||
this->tag = tag;
|
||||
this->program = program;
|
||||
this->arguments = arguments;
|
||||
this->env = env;
|
||||
this->running_list = &running_ext;
|
||||
}
|
||||
|
||||
void ExternalProcess::Start() {
|
||||
if (started) return;
|
||||
started = true;
|
||||
*running_list += this;
|
||||
|
||||
if (show_log) {
|
||||
connect(this, &QProcess::readyReadStandardOutput, this,
|
||||
[&]() {
|
||||
showLog_ext_vt100(readAllStandardOutput().trimmed());
|
||||
});
|
||||
connect(this, &QProcess::readyReadStandardError, this,
|
||||
[&]() {
|
||||
showLog_ext_vt100(readAllStandardError().trimmed());
|
||||
});
|
||||
}
|
||||
|
||||
connect(this, &QProcess::errorOccurred, this,
|
||||
[&](QProcess::ProcessError error) {
|
||||
if (!killed) {
|
||||
crashed = true;
|
||||
showLog_ext(tag, "[Error] Crashed:" + QProcess::errorString());
|
||||
dialog_message("ExternalProcess", "Crashed");
|
||||
}
|
||||
});
|
||||
connect(this, &QProcess::stateChanged, this,
|
||||
[&](QProcess::ProcessState state) {
|
||||
if (state == QProcess::NotRunning) {
|
||||
if (killed) {
|
||||
showLog_ext(tag, "Stopped");
|
||||
} else if (!crashed) {
|
||||
crashed = true;
|
||||
Kill();
|
||||
showLog_ext(tag, "[Error] Crashed?");
|
||||
dialog_message("ExternalProcess", "Crashed");
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
showLog_ext(tag, "[Starting] " + env.join(" ") + " " + program + " " + arguments.join(" "));
|
||||
|
||||
QProcess::setEnvironment(env);
|
||||
QProcess::start(program, arguments);
|
||||
}
|
||||
|
||||
void ExternalProcess::Kill() {
|
||||
if (killed) return;
|
||||
killed = true;
|
||||
running_list->removeAll(this);
|
||||
if (!crashed) {
|
||||
QProcess::kill();
|
||||
QProcess::waitForFinished(500);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user