/* * Initialize and launch process object */ bool AbstractTool::startProcess(QProcess &process, const QString &program, const QStringList &args) { static AssignProcessToJobObjectFun AssignProcessToJobObjectPtr = NULL; QMutexLocker lock(m_mutex_startProcess); emit messageLogged(commandline2string(program, args) + "\n"); QProcessEnvironment env = process.processEnvironment(); if(env.isEmpty()) env = QProcessEnvironment::systemEnvironment(); env.insert("TEMP", QDir::toNativeSeparators(lamexp_temp_folder2())); env.insert("TMP", QDir::toNativeSeparators(lamexp_temp_folder2())); process.setProcessEnvironment(env); if(!AssignProcessToJobObjectPtr) { QLibrary Kernel32Lib("kernel32.dll"); AssignProcessToJobObjectPtr = (AssignProcessToJobObjectFun) Kernel32Lib.resolve("AssignProcessToJobObject"); } process.setProcessChannelMode(QProcess::MergedChannels); process.setReadChannel(QProcess::StandardOutput); process.start(program, args); if(process.waitForStarted()) { if(AssignProcessToJobObjectPtr) { AssignProcessToJobObjectPtr(m_handle_jobObject, process.pid()->hProcess); } if(!SetPriorityClass(process.pid()->hProcess, BELOW_NORMAL_PRIORITY_CLASS)) { SetPriorityClass(process.pid()->hProcess, IDLE_PRIORITY_CLASS); } lock.unlock(); if(m_firstLaunch) { emit statusUpdated(0); m_firstLaunch = false; } return true; } emit messageLogged("Process creation has failed :-("); QString errorMsg= process.errorString().trimmed(); if(!errorMsg.isEmpty()) emit messageLogged(errorMsg); process.kill(); process.waitForFinished(-1); return false; }
/* * Initialize and launch process object */ bool AbstractTool::startProcess(QProcess &process, const QString &program, const QStringList &args, const QString &workingDir) { QMutexLocker lock(&s_startProcessMutex); if((!s_startProcessTimer.isNull()) && s_startProcessTimer->isValid()) { qint64 elapsed = s_startProcessTimer->elapsed(); while(elapsed < START_DELAY) { lock.unlock(); MUtils::OS::sleep_ms((size_t)(START_DELAY - elapsed)); lock.relock(); elapsed = s_startProcessTimer->elapsed(); } } emit messageLogged(commandline2string(program, args) + "\n"); MUtils::init_process(process, workingDir.isEmpty() ? QFileInfo(program).absolutePath() : workingDir); process.start(program, args); if(process.waitForStarted()) { if(!s_jobObjectInstance.isNull()) { if(!s_jobObjectInstance->addProcessToJob(&process)) { qWarning("Failed to assign process to job object!"); } } MUtils::OS::change_process_priority(&process, -1); if(m_firstLaunch) { emit statusUpdated(0); m_firstLaunch = false; } s_startProcessTimer->start(); return true; } emit messageLogged("Process creation has failed :-("); QString errorMsg= process.errorString().trimmed(); if(!errorMsg.isEmpty()) emit messageLogged(errorMsg); process.kill(); process.waitForFinished(-1); s_startProcessTimer->start(); return false; }
/* * Initialize and launch process object */ bool AbstractTool::startProcess(QProcess &process, const QString &program, const QStringList &args) { QMutexLocker lock(&s_mutex_startProcess); if(lamexp_current_file_time() <= s_lastLaunchTime) { lamexp_sleep(START_DELAY); } emit messageLogged(commandline2string(program, args) + "\n"); lamexp_init_process(process, QFileInfo(program).absolutePath()); process.start(program, args); if(process.waitForStarted()) { if(s_jobObject) { if(!s_jobObject->addProcessToJob(&process)) { qWarning("Failed to assign process to job object!"); } } lamexp_change_process_priority(&process, -1); lock.unlock(); if(m_firstLaunch) { emit statusUpdated(0); m_firstLaunch = false; } s_lastLaunchTime = lamexp_current_file_time() + START_DELAY_NANO; return true; } emit messageLogged("Process creation has failed :-("); QString errorMsg= process.errorString().trimmed(); if(!errorMsg.isEmpty()) emit messageLogged(errorMsg); process.kill(); process.waitForFinished(-1); s_lastLaunchTime = lamexp_current_file_time() + START_DELAY_NANO; return false; }
bool AbstractTool::startProcess(QProcess &process, const QString &program, const QStringList &args, bool mergeChannels) { QMutexLocker lock(&s_mutexStartProcess); log(commandline2string(program, args) + "\n"); process.setWorkingDirectory(QDir::tempPath()); if(mergeChannels) { process.setProcessChannelMode(QProcess::MergedChannels); process.setReadChannel(QProcess::StandardOutput); } else { process.setProcessChannelMode(QProcess::SeparateChannels); process.setReadChannel(QProcess::StandardError); } process.start(program, args); if(process.waitForStarted()) { m_jobObject->addProcessToJob(&process); MUtils::OS::change_process_priority(&process, m_preferences->getProcessPriority()); lock.unlock(); return true; } log("Process creation has failed :-("); QString errorMsg= process.errorString().trimmed(); if(!errorMsg.isEmpty()) log(errorMsg); process.kill(); process.waitForFinished(-1); return false; }