我想从QtScript脚本运行几个并发作业:
function job1() { ... }
function job2() { ... }
runConcurrentJobs(job1, job2)
作业基本上是一系列远程过程调用(ZeroC Ice),需要在几个点同步。
Qt 4.8.0文档没有提及QScriptEngine
线程安全性。我的问题:
使用单个QScriptEngine
同时从多个线程中执行QtScript函数是否安全?
您建议采用什么方法来完成任务?
备注:
答案 0 :(得分:0)
一般来说,如果文档没有提及线程,那么它就不是线程安全的。
我会重写使用异步请求。把它们踢掉,然后等待它们。
答案 1 :(得分:0)
QScriptEngine
被记录为“可重入”,这意味着,基本上,您可以使用多线程,但每个线程只能使用一个QScriptEngine
。
现在,如果函数job1()
和job2()
可以同时运行,原则上应该可以将它们分成两个不同的QScriptEngine
(如果没有,则很容易函数使用局部变量,如果涉及全局变量则更难。
runConcurrentJobs()
实现为Q_INVOKABLE
函数(或插槽)。在那里,做一些像
这样的事情 void runConcurrently (const QString &functionname1, QString &functionname2) {
MyScriptThread thread1 (functionname1);
MyScriptThread thread2 (functionname2);
thread1.start();
thread2.start();
thread1.wait ();
thread2.wait ();
// optionally fetch return values from the threads and return them
}
MyScriptThread派生自QThread并实现QThread :: run()大致如下:
void MyScriptThread::run () {
QScriptEngine engine;
engine.evaluate (common_script_code);
result = engine.evaluate (the_threads_function);
// the_threads_function passed as a QScriptProgram or QString
}