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更新-新增基于作业过程的初始化和释放方法,通过使用基于作业过程的初始化和自动释放方法,可以更好的处理参数传递的问题。