QWorker自定义作业数据指针释放方法

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指针。

分享到: