sexta-feira, 1 de fevereiro de 2019

Multicast events

Seguindo o raciocínio do Allen Bauer em MulticastEvents using generics, implementei uma solução para versões do Delphi onde generics não estão disponíveis e os recursos de rtti são limitados. A utilização é relativamente igual, não contando apenas com alguns "açucares de sintaxe".
Para versões do Delphi que não contam com o invocador de eventos "TDynamicInvokeEvent" localizado na unit ObjAuto.pas, deixarei disponível a ObjAutoX.pas. Caso contrário, substitua o uses da unit MuticastEvent.pas.
Diferente do exemplo feito por Allen Bauer, esta implementação se faz indiferente de opções de otimização e de geração de stack frames, mas também conta com algum inline assembly.
O multicast serve como uma lista de ações que devem acontecer quando um evento é executado. Basicamente substitui-se a ação original do evento pelo "Invoke" do multicast, que fica responsável pela delegação das ações.
Implementei duas formas de invocar as ações, via "EventDispatcher" e "MethodDispatcher". Estes se diferenciam pela forma que passam os parâmetros para as ações delegadas.
Sabendo que variants são menos performáticas, o "EventDispatcher" faz a passagem direta dos parâmetros via registradores e a stack, limitando-se a convenção de chamada "register". Mas, comumente não criamos eventos com outras convenções de chamada, então não deve ser problema.
O "MethodDispacher" cria variants contendo os parâmetros passados na invocação do evento, e as ações devem ser chamadas e os parâmetros passados via reflexão. Por não achar necessário, não implementei esse recurso, mas deixei-o como opcional para extensão.
Deixarei o projeto, com exemplos, disponível no link: Multicast Events