QWorker技巧之参数化

QWorker本身只提供了一个附加的Data成员来让用户传递额外的数据,而Data是一个Pointer,这就决定了它可以允许用户随意控制传入的内容。但就象所有的异步过程一样,传入的内存块如果是从堆中临时申请的,那么它就存在一个释放的问题,谁来负责释放,怎么去释放?

QWorker想到了这一个问题,提供了一个不错的解决方案:由QWorker本身负责在正确的时间释放。

Data成员正常的类型一般是结构体、对象和接口,QWorker的各个函数提供了一个AFreeType参数,来告诉QWorker如何去释放Data指针指向的内容。

jdfFreeByUser : 用户管理对象的释放,默认是这个

jdfFreeAsObject : 附加的是一个TObject继承的对象,作业完成时会调用FreeObject释放

jdfFreeAsSimpleRecord : 附加的是一个Record对象,作业完成时会调用Dispose释放

jdfFreeAsInterface : 附加的是一个接口对象,添加时会增加计数,作业完成时会减少计数

jdfFreeAsC1~jdfFreeAsC6:用户自定义的释放方式,用于支持除上述方式外的其它方式

   下面是一个演示的代码:

...

    uses qmsgpack;

    ...

    AMsgPack:=TQMsgPack.Create;

    AMsgPack.Add('Name','参数样式2');

    AMsgPack.Add('Id',101);

    Workers.Post(DoMsgPackJob,

      AMsgPack,

      True,jdfFreeAsObject

      );

其中的AMsgPack参数在作业完成或者被取消时,会自动被释放,而不用担心内存泄露。

QWorker还提供了一个TQJobExtData类型来简化参数的传递操作,具体相关的说明,请参考:QWorker更新-新增基于作业过程的初始化和释放方法,通过使用基于作业过程的初始化和自动释放方法,可以更好的处理参数传递的问题。

 

分享到: