Manager: Show a message box if a VM process crashes

This commit is contained in:
Alexander Babikov
2025-08-17 04:27:09 +05:00
parent d7aee604c4
commit 29596dec25
2 changed files with 10 additions and 1 deletions

View File

@@ -294,6 +294,7 @@ illegal_chars:
QMessageBox msgbox(QMessageBox::Warning, tr("Warning"), tr("Killing a virtual machine can cause data loss. Only do this if the 86Box process gets stuck.\n\nDo you really wish to kill the virtual machine \"%1\"?").arg(selected_sysconfig->displayName), QMessageBox::StandardButton::Yes | QMessageBox::StandardButton::No, parent); QMessageBox msgbox(QMessageBox::Warning, tr("Warning"), tr("Killing a virtual machine can cause data loss. Only do this if the 86Box process gets stuck.\n\nDo you really wish to kill the virtual machine \"%1\"?").arg(selected_sysconfig->displayName), QMessageBox::StandardButton::Yes | QMessageBox::StandardButton::No, parent);
msgbox.exec(); msgbox.exec();
if (msgbox.result() == QMessageBox::Yes) { if (msgbox.result() == QMessageBox::Yes) {
disconnect(selected_sysconfig->process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), nullptr, nullptr);
selected_sysconfig->process->kill(); selected_sysconfig->process->kill();
} }
}); });
@@ -616,13 +617,16 @@ VMManagerMain::addNewSystem(const QString &name, const QString &dir, const QStri
const auto new_system = new VMManagerSystem(newSystemConfigFile.absoluteFilePath()); const auto new_system = new VMManagerSystem(newSystemConfigFile.absoluteFilePath());
new_system->launchSettings(); new_system->launchSettings();
// Handle this in a closure so we can capture the temporary new_system object // Handle this in a closure so we can capture the temporary new_system object
disconnect(new_system->process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), nullptr, nullptr);
connect(new_system->process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), connect(new_system->process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
[=](const int exitCode, const QProcess::ExitStatus exitStatus) { [=](const int exitCode, const QProcess::ExitStatus exitStatus) {
if (exitCode != 0 || exitStatus != QProcess::NormalExit) { if (exitCode != 0 || exitStatus != QProcess::NormalExit) {
qInfo().nospace().noquote() << "Abnormal program termination while creating new system: exit code " << exitCode << ", exit status " << exitStatus; qInfo().nospace().noquote() << "Abnormal program termination while creating new system: exit code " << exitCode << ", exit status " << exitStatus;
qInfo() << "Not adding system due to errors"; qInfo() << "Not adding system due to errors";
QString errMsg = tr("The virtual machine \"%1\"'s process has unexpectedly terminated with exit code %2.").arg(
(!displayName.isEmpty() ? displayName : name), QString::number(exitCode));
QMessageBox::critical(this, tr("Error adding system"), QMessageBox::critical(this, tr("Error adding system"),
tr("Abnormal program termination while creating new system: exit code %1, exit status %2.\n\nThe system will not be added.").arg(QString::number(exitCode), exitStatus)); QString("%1\n\n%2").arg(errMsg, tr("The system will not be added.")));
delete new_system; delete new_system;
return; return;
} }

View File

@@ -26,6 +26,7 @@
#include <QCryptographicHash> #include <QCryptographicHash>
#include <QtNetwork> #include <QtNetwork>
#include <QElapsedTimer> #include <QElapsedTimer>
#include <QMessageBox>
#include <QProgressDialog> #include <QProgressDialog>
#include <QWindow> #include <QWindow>
#include "qt_util.hpp" #include "qt_util.hpp"
@@ -445,6 +446,8 @@ VMManagerSystem::launchMainProcess() {
[=](const int exitCode, const QProcess::ExitStatus exitStatus){ [=](const int exitCode, const QProcess::ExitStatus exitStatus){
if (exitCode != 0 || exitStatus != QProcess::NormalExit) { if (exitCode != 0 || exitStatus != QProcess::NormalExit) {
qInfo().nospace().noquote() << "Abnormal program termination while launching main process: exit code " << exitCode << ", exit status " << exitStatus; qInfo().nospace().noquote() << "Abnormal program termination while launching main process: exit code " << exitCode << ", exit status " << exitStatus;
QMessageBox::critical(this, tr("Virtual machine crash"),
tr("The virtual machine \"%1\"'s process has unexpectedly terminated with exit code %2.").arg(displayName, QString::number(exitCode)));
return; return;
} }
}); });
@@ -498,6 +501,8 @@ VMManagerSystem::launchSettings() {
[=](const int exitCode, const QProcess::ExitStatus exitStatus){ [=](const int exitCode, const QProcess::ExitStatus exitStatus){
if (exitCode != 0 || exitStatus != QProcess::NormalExit) { if (exitCode != 0 || exitStatus != QProcess::NormalExit) {
qInfo().nospace().noquote() << "Abnormal program termination while launching settings: exit code " << exitCode << ", exit status " << exitStatus; qInfo().nospace().noquote() << "Abnormal program termination while launching settings: exit code " << exitCode << ", exit status " << exitStatus;
QMessageBox::critical(this, tr("Virtual machine crash"),
tr("The virtual machine \"%1\"'s process has unexpectedly terminated with exit code %2.").arg(displayName, QString::number(exitCode)));
return; return;
} }