feat: restart profile after core crash

This commit is contained in:
arm64v8a
2022-10-18 17:15:49 +08:00
parent b46cd2da3d
commit 2e991b675d
6 changed files with 35 additions and 7 deletions

View File

@@ -55,6 +55,15 @@
"ff00::/8" "ff00::/8"
], ],
"outbound": "block" "outbound": "block"
},
{
"process_name": [
"nekoray_core",
"nekoray_core.exe",
"nekobox_core",
"nekobox_core.exe"
],
"outbound": "direct"
} }
%PROCESS_NAME_RULE% %PROCESS_NAME_RULE%
%CIDR_RULE% %CIDR_RULE%

View File

@@ -107,3 +107,14 @@ void runOnUiThread(const std::function<void()> &callback, QObject *parent) {
void runOnNewThread(const std::function<void()> &callback) { void runOnNewThread(const std::function<void()> &callback) {
createQThread(callback)->start(); createQThread(callback)->start();
} }
void setTimeout(const std::function<void()> &callback, QObject *obj, int timeout) {
auto t = new QTimer;
QObject::connect(t, &QTimer::timeout, obj, [=] {
callback();
t->deleteLater();
});
t->setSingleShot(true);
t->setInterval(timeout);
t->start();
}

View File

@@ -198,3 +198,5 @@ inline void connectOnce(EMITTER *emitter, SIGNAL signal, RECEIVER *receiver, Rec
*connection = QObject::connect(emitter, signal, receiver, onTriggered, connectionType); *connection = QObject::connect(emitter, signal, receiver, onTriggered, connectionType);
} }
void setTimeout(const std::function<void()> &callback, QObject *obj, int timeout = 0);

View File

@@ -90,19 +90,22 @@ namespace NekoRay::sys {
if (!dataStore->core_prepare_exit && state == QProcess::NotRunning) { if (!dataStore->core_prepare_exit && state == QProcess::NotRunning) {
if (failed_to_start) return; // no retry if (failed_to_start) return; // no retry
restart_id = NekoRay::dataStore->started_id;
dialog_message("ExternalProcess", "Crashed");
showLog("[Error] core exited, restarting.\n"); showLog("[Error] core exited, restarting.\n");
// Restart // Restart
auto t = new QTimer; setTimeout([=] {
connect(t, &QTimer::timeout, this, [=] {
Kill(); Kill();
ExternalProcess::started = false; ExternalProcess::started = false;
Start(); Start();
t->deleteLater(); }, this, 1000);
}); } else if (state == QProcess::Running && restart_id >= 0) {
t->setSingleShot(true); // Restart profile
t->setInterval(1000); setTimeout([=] {
t->start(); dialog_message("ExternalProcess", "CoreRestarted," + Int2String(restart_id));
restart_id = -1;
}, this, 1000);
} }
}); });
} }

View File

@@ -38,6 +38,7 @@ namespace NekoRay::sys {
private: private:
bool show_stderr = false; bool show_stderr = false;
bool failed_to_start = false; bool failed_to_start = false;
int restart_id = -1;
}; };
// start & kill change this list // start & kill change this list

View File

@@ -481,6 +481,8 @@ void MainWindow::dialog_message_impl(const QString &sender, const QString &info)
} else if (sender == "ExternalProcess") { } else if (sender == "ExternalProcess") {
if (info == "Crashed") { if (info == "Crashed") {
neko_stop(); neko_stop();
} else if (info.startsWith("CoreRestarted")) {
neko_start(info.split(",")[1].toInt());
} }
} }
} }