我想知道DWScript是否能够在脚本中使用线程,因为一些引擎不同步对其内部数据结构的访问。
发布于 2012-06-04 14:03:04
Arnaud给出了关键点:
运行脚本的多个执行类似于在Delphi中拥有多个线程,尽管每个新的执行不仅有自己的堆栈(像Delphi线程),而且还有自己的变量空间(在Delphi中,这有点像到处都有"thread var“)。并且DWScript执行不必在它们自己的线程中,它们可以跨线程移动,或者轮询并在较少的线程中使用(唯一的限制是每次执行只能由一个线程使用,如上所述)。
因此,没有什么可以阻止您公开一个在脚本函数中产生线程(和相应的执行)的函数,但是跨执行的通信不会通过共享变量(就像在Delphi中那样),而是必须通过您自己公开的函数(或外部变量)、返回值(使用"evaluate“方法,cf )。单元测试)、“共享”对象实例或“全局变量”。
所谓“全局变量”,是指在dwsGlobalVarsFunctions.pas中定义的函数,这些函数可用于执行之间的数据交换。要激活它们,只需在项目中的某个位置添加"uses dwsGlobalVarsFunctions“即可。
它们公开了一组Read/WriteGlobalVar函数,这些函数允许在同一个Delphi进程中运行的所有脚本执行中存储和检索命名变量,并且从线程的角度来看,这些读取和写入是“原子的”。
发布于 2012-06-04 00:13:57
甚至不需要打开DWS文档。:)
看一看at this StackOverflow answer by Eric
例如,DWS现在能够对单个编译的脚本执行多个线程安全的执行,而旧的代码库是围绕一个编译的脚本一次只能由一个线程执行的限制而构建的。
简而言之:
当然,这里是the official documentation page about thread safety in DWS。
对于一个给定的IdwsProgram,你现在可以有尽可能多的程序执行,每次执行将只使用内存用于堆和堆栈,编译后的表达式树是共享的。这两个新接口都使用引用计数内存管理。
https://stackoverflow.com/questions/10861299
复制相似问题