refactor codes that run programs
This commit is contained in:
parent
b2e88c4c00
commit
59ea699fb7
|
@ -10,6 +10,11 @@
|
|||
#include "projectcompiler.h"
|
||||
#include "../platform.h"
|
||||
|
||||
enum RunProgramFlag {
|
||||
RPF_PAUSE_CONSOLE = 0x0001,
|
||||
RPF_REDIRECT_INPUT = 0x0002
|
||||
};
|
||||
|
||||
CompilerManager::CompilerManager(QObject *parent) : QObject(parent)
|
||||
{
|
||||
mCompiler = nullptr;
|
||||
|
@ -197,26 +202,31 @@ void CompilerManager::run(const QString &filename, const QString &arguments, con
|
|||
if (mRunner!=nullptr) {
|
||||
return;
|
||||
}
|
||||
QChar redirectChar = '0';
|
||||
QString redirectInputFilename;
|
||||
bool redirectInput=false;
|
||||
if (pSettings->executor().redirectInput()
|
||||
&& !pSettings->executor().inputFilename().isEmpty()) {
|
||||
redirectInput =true;
|
||||
redirectChar = '1';
|
||||
redirectInputFilename = pSettings->executor().inputFilename();
|
||||
}
|
||||
if (pSettings->executor().pauseConsole() && programHasConsole(filename)) {
|
||||
if (programHasConsole(filename)) {
|
||||
int consoleFlag=0;
|
||||
if (redirectInput)
|
||||
consoleFlag |= RPF_REDIRECT_INPUT;
|
||||
if (pSettings->executor().pauseConsole())
|
||||
consoleFlag |= RPF_PAUSE_CONSOLE;
|
||||
QString newArguments = QString(" %1 \"%2\" %3")
|
||||
.arg(redirectChar)
|
||||
.arg(consoleFlag)
|
||||
.arg(toLocalPath(filename)).arg(arguments);
|
||||
mRunner = new ExecutableRunner(includeTrailingPathDelimiter(pSettings->dirs().app())+"ConsolePauser.exe",newArguments,workDir);
|
||||
if (redirectInput)
|
||||
mRunner->setRedirectConsoleProgram(true);
|
||||
mRunner->setStartConsole(true);
|
||||
} else {
|
||||
mRunner = new ExecutableRunner(filename,arguments,workDir);
|
||||
}
|
||||
if (redirectInput) {
|
||||
mRunner->setRedirectInput(true);
|
||||
mRunner->setRedirectInputFilename(redirectInputFilename);
|
||||
}
|
||||
connect(mRunner, &ExecutableRunner::finished, this ,&CompilerManager::onRunnerTerminated);
|
||||
connect(mRunner, &ExecutableRunner::finished, pMainWindow ,&MainWindow::onRunFinished);
|
||||
connect(mRunner, &ExecutableRunner::runErrorOccurred, pMainWindow ,&MainWindow::onRunErrorOccured);
|
||||
|
|
|
@ -13,7 +13,8 @@ ExecutableRunner::ExecutableRunner(const QString &filename, const QString &argum
|
|||
mArguments(arguments),
|
||||
mWorkDir(workDir),
|
||||
mStop(false),
|
||||
mRedirectConsoleProgram(false)
|
||||
mRedirectInput(false),
|
||||
mStartConsole(false)
|
||||
{
|
||||
|
||||
}
|
||||
|
@ -23,14 +24,24 @@ void ExecutableRunner::stop()
|
|||
mStop = true;
|
||||
}
|
||||
|
||||
bool ExecutableRunner::redirectConsoleProgram() const
|
||||
bool ExecutableRunner::startConsole() const
|
||||
{
|
||||
return mRedirectConsoleProgram;
|
||||
return mStartConsole;
|
||||
}
|
||||
|
||||
void ExecutableRunner::setRedirectConsoleProgram(bool newRedirectConsoleProgram)
|
||||
void ExecutableRunner::setStartConsole(bool newStartConsole)
|
||||
{
|
||||
mRedirectConsoleProgram = newRedirectConsoleProgram;
|
||||
mStartConsole = newStartConsole;
|
||||
}
|
||||
|
||||
bool ExecutableRunner::redirectInput() const
|
||||
{
|
||||
return mRedirectInput;
|
||||
}
|
||||
|
||||
void ExecutableRunner::setRedirectInput(bool isRedirect)
|
||||
{
|
||||
mRedirectInput = isRedirect;
|
||||
}
|
||||
|
||||
const QString &ExecutableRunner::redirectInputFilename() const
|
||||
|
@ -69,28 +80,26 @@ void ExecutableRunner::run()
|
|||
}
|
||||
env.insert("PATH",path);
|
||||
process.setProcessEnvironment(env);
|
||||
if (redirectConsoleProgram()) {
|
||||
process.setCreateProcessArgumentsModifier([](QProcess::CreateProcessArguments * args){
|
||||
process.setCreateProcessArgumentsModifier([this](QProcess::CreateProcessArguments * args){
|
||||
if (mStartConsole) {
|
||||
args->flags |= CREATE_NEW_CONSOLE;
|
||||
});
|
||||
} else {
|
||||
process.setCreateProcessArgumentsModifier([](QProcess::CreateProcessArguments * args){
|
||||
args->flags |= CREATE_NEW_CONSOLE;
|
||||
args->startupInfo -> dwFlags &= ~STARTF_USESTDHANDLES;
|
||||
});
|
||||
}
|
||||
if (!mRedirectInput) {
|
||||
args->startupInfo -> dwFlags &= ~STARTF_USESTDHANDLES;
|
||||
}
|
||||
});
|
||||
process.connect(&process, &QProcess::errorOccurred,
|
||||
[&](){
|
||||
errorOccurred= true;
|
||||
});
|
||||
// qDebug() << mFilename;
|
||||
// qDebug() << QProcess::splitCommand(mArguments);
|
||||
if (!redirectConsoleProgram()) {
|
||||
if (!redirectInput()) {
|
||||
process.closeWriteChannel();
|
||||
}
|
||||
process.start();
|
||||
process.waitForStarted(5000);
|
||||
if (process.state()==QProcess::Running && redirectConsoleProgram()) {
|
||||
if (process.state()==QProcess::Running && redirectInput()) {
|
||||
process.write(ReadFileToByteArray(redirectInputFilename()));
|
||||
process.closeWriteChannel();
|
||||
}
|
||||
|
|
|
@ -12,8 +12,11 @@ public:
|
|||
const QString &redirectInputFilename() const;
|
||||
void setRedirectInputFilename(const QString &newDataFile);
|
||||
|
||||
bool redirectConsoleProgram() const;
|
||||
void setRedirectConsoleProgram(bool newRedirectConsoleProgram);
|
||||
bool redirectInput() const;
|
||||
void setRedirectInput(bool isRedirect);
|
||||
|
||||
bool startConsole() const;
|
||||
void setStartConsole(bool newStartConsole);
|
||||
|
||||
signals:
|
||||
void started();
|
||||
|
@ -29,7 +32,8 @@ private:
|
|||
QString mWorkDir;
|
||||
bool mStop;
|
||||
QString mRedirectInputFilename;
|
||||
bool mRedirectConsoleProgram;
|
||||
bool mRedirectInput;
|
||||
bool mStartConsole;
|
||||
|
||||
// QThread interface
|
||||
protected:
|
||||
|
|
|
@ -352,14 +352,14 @@ void ProjectCompiler::writeMakeObjFilesRules(QFile &file)
|
|||
|
||||
if (mOnlyCheckSyntax) {
|
||||
if (unit->compileCpp())
|
||||
writeln(file, "\t$(CPP) -c " + genMakePath1(shortFileName) + " $(CXXFLAGS) " + encodingStr);
|
||||
writeln(file, "\t$(CPP) -c " + genMakePath1(unit->fileName()) + " $(CXXFLAGS) " + encodingStr);
|
||||
else
|
||||
writeln(file, "\t(CC) -c " + genMakePath1(shortFileName) + " $(CFLAGS) " + encodingStr);
|
||||
writeln(file, "\t(CC) -c " + genMakePath1(unit->fileName()) + " $(CFLAGS) " + encodingStr);
|
||||
} else {
|
||||
if (unit->compileCpp())
|
||||
writeln(file, "\t$(CPP) -c " + genMakePath1(shortFileName) + " -o " + ObjFileName2 + " $(CXXFLAGS) " + encodingStr);
|
||||
writeln(file, "\t$(CPP) -c " + genMakePath1(unit->fileName()) + " -o " + ObjFileName2 + " $(CXXFLAGS) " + encodingStr);
|
||||
else
|
||||
writeln(file, "\t$(CC) -c " + genMakePath1(shortFileName) + " -o " + ObjFileName2 + " $(CFLAGS) " + encodingStr);
|
||||
writeln(file, "\t$(CC) -c " + genMakePath1(unit->fileName()) + " -o " + ObjFileName2 + " $(CFLAGS) " + encodingStr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -955,7 +955,7 @@
|
|||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>946</width>
|
||||
<height>25</height>
|
||||
<height>22</height>
|
||||
</rect>
|
||||
</property>
|
||||
<widget class="QMenu" name="menuFile">
|
||||
|
|
|
@ -9,6 +9,11 @@ using std::string;
|
|||
#define MAX_COMMAND_LENGTH 32768
|
||||
#define MAX_ERROR_LENGTH 2048
|
||||
|
||||
enum RunProgramFlag {
|
||||
RPF_PAUSE_CONSOLE = 0x0001,
|
||||
RPF_REDIRECT_INPUT = 0x0002
|
||||
};
|
||||
|
||||
HANDLE hJob;
|
||||
|
||||
LONGLONG GetClockTick() {
|
||||
|
@ -87,9 +92,11 @@ void PauseExit(int exitcode, bool reInp) {
|
|||
exit(exitcode);
|
||||
}
|
||||
|
||||
string GetCommand(int argc,char** argv,bool &reInp) {
|
||||
string GetCommand(int argc,char** argv,bool &reInp,bool &pauseAfterExit) {
|
||||
string result;
|
||||
reInp = (strcmp(argv[1],"0")!=0) ;
|
||||
int flags = atoi(argv[1]);
|
||||
reInp = flags & RPF_REDIRECT_INPUT;
|
||||
pauseAfterExit = flags & RPF_PAUSE_CONSOLE;
|
||||
for(int i = 2;i < argc;i++) {
|
||||
/*
|
||||
// Quote the first argument in case the path name contains spaces
|
||||
|
@ -183,8 +190,9 @@ int main(int argc, char** argv) {
|
|||
}
|
||||
|
||||
bool reInp;
|
||||
bool pauseAfterExit;
|
||||
// Then build the to-run application command
|
||||
string command = GetCommand(argc,argv,reInp);
|
||||
string command = GetCommand(argc,argv,reInp, pauseAfterExit);
|
||||
HANDLE hOutput = NULL;
|
||||
if (reInp) {
|
||||
SECURITY_ATTRIBUTES sa;
|
||||
|
@ -213,5 +221,7 @@ int main(int argc, char** argv) {
|
|||
// Done? Print return value of executed program
|
||||
printf("\n--------------------------------");
|
||||
printf("\nProcess exited after %.4g seconds with return value %lu\n",seconds,returnvalue);
|
||||
if (pauseAfterExit)
|
||||
PauseExit(returnvalue,reInp);
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue