解决方法
>每个编译器实例一次只能从一个线程调用.您可以同时在多个线程中调用多个编译器实例,并且可以从多个线程使用特定的编译器实例,前提是只有一个线程一次使用它.
>每个编译的程序可以有多个执行,每个执行都可以在自己的线程中运行.如果一个线程一次只使用一个线程,则多个线程也可以使用特定的执行.
>每个执行都有自己的变量空间,它自己的堆栈,对象实例都在堆上,技术上可以跨执行共享,没有锁定机制,但你可以自己创建.
>当使用暴露给它的类或函数(通过TdwsUnit,RTTI等)时,脚本引擎不执行任何同步或锁定,因此在线程中运行脚本执行时,请确保只暴露线程安全的东西(是特别注意RTTI,因为很多RTL和VCL开始时都不是线程安全的)
运行多个脚本执行类似于在Delphi中拥有多个线程,尽管每个新执行不仅有自己的堆栈(如Delphi线程),还有自己的变量空间(在Delphi中,如果你有“线程”,它会有点像var“无处不在”.并且DWScript执行不必在他们自己的线程中,它们可以跨线程移动,或者在较少数量的线程中轮询和使用(唯一的限制是每次执行仅由一个线程一次使用,如上文提到的).
所以没有什么可以阻止你暴露一个会在脚本函数中产生一个线程(和相应的执行)的函数,但跨执行的通信不会通过共享变量(就像你可能想在Delphi中做的那样),但是会有通过您自己的公开函数(或外部变量),返回值(使用“评估”方法,参见单元测试),“共享”对象实例或“全局变量”.
“global vars”是指dwsGlobalVarsFunctions.pas中定义的函数,它们可用于执行间数据交换.要激活它们,只需在项目中的某处“使用dwsGlobalVarsFunctions”即可.
它们公开了一组Read / WriteGlobalVar函数,这些函数允许在同一个Delphi进程中运行的所有脚本执行中存储和检索命名变体,并且这些函数和从线程的角度来看,写入是“原子的”.