QWorker今天的更新加入jdfFreeAsC1~C6是为了应对C++中丰富的内存分配和管理方式,提供了6种自定的的处理方式供用户选择。当然Delphi你要自己去管理一些东西,也一样可以用,比如将Data指向一个池中的对象,然后在释放时返回到池中。下面的例子写的是针对C++的,如new/delete,new[]/delete[],malloc/alloc/free/,LocalAlloc/LocalFree等等,个人觉得对于一个应用程序来说,6种自定义的方式,应该是够用了。
【示例】
下面的例子将jdfFreeAsC1对应了new/delete,jdfFreeAsC2对应于new[]/delete[],先实现一个全局函数,用来关联到Workers的OnCustomFreeData。
void __fastcall FreeDataByNew(TQWorkers* ASender, TQJobDataFreeType AFreeType, const void * AData) { switch (AFreeType) { case jdtFreeAsC1: delete AData; break; case jdfFreeAsC2: delete[]AData; break; } }
在投寄相关类型的Data参数之前,要注册事件关联:
__fastcall TForm3::TForm3(TComponent* Owner) : TForm(Owner) { Workers->OnCustomFreeData=FreeDataByNew; }
现在可以按照常规的方式投寄并自动释放内存了。
void __fastcall TForm3::Button2Click(TObject *Sender) { char *p = new char[2]; p[0] = 'A'; p[1] = '0'; Workers->Post(DoPostJobDone, p, True, jdfFreeAsC2); } void __fastcall TForm3::DoPostJobDone(TQJob *AJob) { ShowMessage(L"作业投寄到执行用时 " + IntToStr((GetTimestamp() - AJob->PushTime) / 10) + L" ms"); }
可以看到,我们的DoPostJobDone没有做任何对AJob->Data成员的处理,而系统会自动调用FreeDataByNew去释放上面代码中分配的p指针。