36 |
|
// Note the () around the function |
37 |
|
e.getXmlDataFunction = new QScriptValue(e.scriptEngine->evaluate("(function getXmlData() { return $xmlData; })")); |
38 |
|
e.setXmlDataFunction = new QScriptValue(e.scriptEngine->evaluate("(function setXmlData(newXmlData) { $xmlData=newXmlData; })")); |
39 |
< |
e.isAvailable = true; |
39 |
> |
e.mutexForEngine = new QMutex; |
40 |
|
|
41 |
|
// Add echo function so user can debug the code |
42 |
|
QScriptValue echoFunction = e.scriptEngine->newFunction(echo); |
74 |
|
// Single tread if small number of files or number of threads = 1 |
75 |
|
if(filesToProcess.size()<=CUSTOM_FILES_PER_THREAD || numThreads == 1){ |
76 |
|
|
77 |
< |
jsCustomCodeEngine &jsEngine = getAvailableJsEngine(); |
77 |
> |
jsCustomCodeEngine &jsEngine = this->jsScriptEngines.first(); |
78 |
|
|
79 |
|
// Process all XmlFiles |
80 |
|
for(int i=0; i<filesToProcess.size(); i++){ |
87 |
|
|
88 |
|
QVector<QFuture<void>> executingThreads; |
89 |
|
|
90 |
< |
for(int i=0; i<=filesToProcess.size()-CUSTOM_FILES_PER_THREAD; i+=CUSTOM_FILES_PER_THREAD){ |
90 |
> |
for(int i=0, iteration = 0; i<=filesToProcess.size()-CUSTOM_FILES_PER_THREAD; i+=CUSTOM_FILES_PER_THREAD, ++iteration){ |
91 |
|
|
92 |
< |
executingThreads << |
93 |
< |
QtConcurrent::run(&this->myThreadPool, [=]() |
92 |
> |
executingThreads << QtConcurrent::run(&this->myThreadPool, [=]() |
93 |
|
{ |
94 |
< |
mutexIsAvailable.lock(); |
95 |
< |
jsCustomCodeEngine &jsEngine = getAvailableJsEngine(); |
96 |
< |
jsEngine.isAvailable = false; |
97 |
< |
mutexIsAvailable.unlock(); |
94 |
> |
|
95 |
> |
const int indexJsEngine = iteration % this->numThreads; |
96 |
> |
|
97 |
> |
jsCustomCodeEngine &jsEngine = this->jsScriptEngines[indexJsEngine]; |
98 |
> |
|
99 |
> |
jsEngine.mutexForEngine->lock(); |
100 |
|
|
101 |
|
QString currXmlFileStringThread; |
102 |
|
|
116 |
|
customCodeUnwinding(filesToProcess.at(i+3),currXmlFileStringThread,*jsEngine.scriptEngine,beginThread,elapsedSecsThread,engineResultThread, |
117 |
|
*jsEngine.jsFunction,*jsEngine.getXmlDataFunction,*jsEngine.setXmlDataFunction,backupsEnabled,verboseEnabled); |
118 |
|
|
119 |
< |
mutexIsAvailable.lock(); |
119 |
< |
jsEngine.isAvailable = true; |
120 |
< |
mutexIsAvailable.unlock(); |
119 |
> |
jsEngine.mutexForEngine->unlock(); |
120 |
|
}); |
121 |
|
} |
122 |
|
|
129 |
|
|
130 |
|
int alreadyProcessedFiles=(filesToProcess.size()/CUSTOM_FILES_PER_THREAD)*CUSTOM_FILES_PER_THREAD; |
131 |
|
|
132 |
< |
jsCustomCodeEngine &jsEngine = getAvailableJsEngine(); |
132 |
> |
jsCustomCodeEngine &jsEngine = this->jsScriptEngines.first(); |
133 |
|
|
134 |
|
for(int i=alreadyProcessedFiles; i<filesToProcess.size(); i++){ |
135 |
|
|
145 |
|
UtilXmlTools::displayErrorMessage("@CUSTOM_CODE","Uncaught js exception (user code) at line " +QString::number(engine.uncaughtExceptionLineNumber()) + ":\n" + engineResult.toString()); |
146 |
|
} |
147 |
|
} |
149 |
– |
|
150 |
– |
XmlCustomCode::jsCustomCodeEngine& XmlCustomCode::getAvailableJsEngine(){ |
151 |
– |
for(jsCustomCodeEngine &e : this->jsScriptEngines){ |
152 |
– |
if(e.isAvailable){ |
153 |
– |
return e; |
154 |
– |
} |
155 |
– |
} |
156 |
– |
|
157 |
– |
throw std::runtime_error("Could't find an available js engine for custom command."); |
158 |
– |
} |