Remove the timeout for pre/post commands. Fixes #107

This commit is contained in:
Jan Dalheimer 2014-03-15 09:02:56 +01:00
parent de2eb3fc54
commit a74f3b553a
2 changed files with 34 additions and 4 deletions

View File

@ -259,7 +259,14 @@ void MinecraftProcess::finish(int code, ExitStatus status)
void MinecraftProcess::killMinecraft()
{
killed = true;
if (m_prepostlaunchprocess.state() == QProcess::Running)
{
m_prepostlaunchprocess.kill();
}
else
{
kill();
}
}
bool MinecraftProcess::preLaunch()
@ -271,8 +278,10 @@ bool MinecraftProcess::preLaunch()
// Launch
emit log(tr("Running Pre-Launch command: %1").arg(prelaunch_cmd));
m_prepostlaunchprocess.start(prelaunch_cmd);
// Wait
m_prepostlaunchprocess.waitForFinished();
if (!waitForPrePost())
{
return false;
}
// Flush console window
if (!m_err_leftover.isEmpty())
{
@ -310,7 +319,10 @@ bool MinecraftProcess::postLaunch()
postlaunch_cmd = substituteVariables(postlaunch_cmd);
emit log(tr("Running Post-Launch command: %1").arg(postlaunch_cmd));
m_prepostlaunchprocess.start(postlaunch_cmd);
m_prepostlaunchprocess.waitForFinished();
if (!waitForPrePost())
{
return false;
}
// Flush console window
if (!m_err_leftover.isEmpty())
{
@ -338,6 +350,23 @@ bool MinecraftProcess::postLaunch()
return true;
}
bool MinecraftProcess::waitForPrePost()
{
m_prepostlaunchprocess.waitForStarted();
QEventLoop eventLoop;
auto finisher = [this, &eventLoop](QProcess::ProcessState state)
{
if (state == QProcess::NotRunning)
{
eventLoop.quit();
}
};
auto connection = connect(&m_prepostlaunchprocess, &QProcess::stateChanged, finisher);
int ret = eventLoop.exec();
disconnect(connection);
return ret == 0;
}
QMap<QString, QString> MinecraftProcess::getVariables() const
{
QMap<QString, QString> out;

View File

@ -133,6 +133,7 @@ protected:
bool preLaunch();
bool postLaunch();
bool waitForPrePost();
QMap<QString, QString> getVariables() const;
QString substituteVariables(const QString &cmd) const;