Delphi 可以快速开发桌面程序,用来做dll 封装操作,封装窗体都是很方便的。
在 delphi 做动态库时,会自动提示要 uses ShareMem,这个实际用起来是不方便的,因为 dll 可能要发布,要给其他人用,而别人用什么语言来开发是说不准的,如果不是delphi,就没办法用了。因此在接口上一般是用 pchar来代替string。但是在内部,string 还是可以拿来用的。
这样就会产生一个问题,如果动态库是支持多线程来用的,而在动态库内部并没有显式的创建一个线程时,烦繁使用 string 就说不定什么时候会产生一个内存出错。
在Delphi 内部,定义了一个 isMultiThread 的boolean 型全局变量(好象是在 system 单元)。默认这个变量是 false的。当显示地创建一个线程时(如TThread.Create),会置成true。否则一直是false。
这个变量唯一使用的地方是在 GetMem 和 FreeMem时,如果为 True,会先进入临界区,操作完成后退出。如果为false就没有临界区了。
因此在编写多线程安全的动态库时,一定要记得在动态库初始化的时候手动加上 isMultiThread=true; 这样强制delphi来使用临界区操作。
如果调用程序也是用 delphi 来写的,可能会多线程使用,那最好也在初始化的时候加上这句。值得注意的是,调用程序和动态库的这两个变量是两个互不相干的,也就是两边都得加,只在一方加上是影响不了另一方的。
其他有关多线程安全的就是一些常识了,对可能多线程访问的代码,要用事件,信号量,临界区等方法加以保护。使用方法可以参考delphi的帮助文档,或msdn,或网上的大堆文章。