QWorker更新-作业附加数据释放方式jdfFreeAsRecord改为jdfFreeAsSimpleRecord

【问题描述】

QWorker的释放记录类型的附加数据时,实际释放的是一个指针(直接FreeMem),如果包括有复杂的数据类型,如字符串、动态数组等,结果肯定就会是造成内存泄露,而原来的名称很容易给用户带来歧义,认为能够释放各种记录类型。所以修改该名称以便提示用户注意。

释放复杂记录类型的自动释放请使用jdfFreeAsC1~jdfFreeAsC6,具体例子,可以参考QWorkerDemo。如果释放的复杂记录超过6种,可以合并,并在传递Data成员参数时予以处理,参考逻辑如下:

type
   TMyRecord=record
   ...
   end;
   PMyRecord=^TMyRecord;
   TComplexRecord=record
      TypeId:Byte;
      case Integer of 
        1:(MyRecord:PMyRecord);
        ....     
   end;
   PComplexRecord=^TComplexRecord;
...
var
  AComplex:PComplexRecord;
begin
New(AComplex);
New(AComplex.MyRecord);
...
Workers.Post(...AComplex,jdfFreeAsC1,...);
end;
...

procedure DoCustomFreeDataC1(...)
var
  pData:PComplexRecord;
begin
pData:=AData;
case pData.TypeId of
  1:...
  2:...
end;
end;

 

【严重级别】

一般

【更新级别】

可选

【特别感谢】

阿木报告此问题,群中qsl等多位群友提供意见和建议。

分享到: