当以多线程方式访问COM诸如IXMLDocument和IXMLNode/等等的对象接口时,Delphi7中似乎存在一些内存问题.其他人COM interfaces可能会分享这个问题,但我的"研究"并不是那么深刻,因为我必须继续我现在的项目.创建TXMLDocument并通过接口,如操纵它IXMLDocument,并IXMLNode在单个线程上是好的,但在多线程的方法,当一个线程创建的TXMLDocument对象和其他人操纵它使用越来越多的内存.CoInitializeEx(nil, COINIT_MULTITHREADED)在每个线程中调用但是徒劳无功.似乎每个线程得到一个接口时,并没有释放它分配一些内存,但每一次的线程分配给它-至少在某一个接口-例如DocumentElement或ChildNodes- 所以在创建对象的线程旁边有一个工作线程 - 不会导致可见的内存泄漏.但是,动态创建的线程的行为方式都相同,最终消耗了进程内存.
这是我的完整测试应用程序Delphi7 form作为SCCE,它试图显示上面提到的三个不同场景 - 单线程,一个工作线程和动态创建的线程.
unit uComTest;
interface
uses
Windows, SysUtils, Classes, Forms, ExtCtrls, Controls, StdCtrls, XMLDoc, XMLIntf, ActiveX;
type
TMyThread = class(TThread)
procedure Execute;override;
end;
TForm1 = class(TForm)
btnMainThread: TButton;
edtText: TEdit;
Timer1: TTimer;
btnOneThread: TButton;
btnMultiThread: TButton;
Timer2: TTimer;
chkXMLUse: TCheckBox;
procedure FormCreate(Sender: TObject);
procedure btnMainThreadClick(Sender: TObject);
procedure …Run Code Online (Sandbox Code Playgroud)