Uma das muitas habilidades do Magic xpa (UniPaaS), inclui a capacidade de executar rotinas (programs ou tasks) em paralelo.
Ao iniciar um programa/tarefa definido com “paralelo”, um novo contexto (thread) é criado para ele. Contexto neste caso significa área de memória particular. Nela, estarão cópias das variáveis do Main Program, variáveis de ambiente Magic xpa (GetParam/SetParam), configurações de ambiente (MAGIC.INI) e tabelas de memória. Tudo privativo, à parte das demais existentes. E justamente por serem cópias, significa que alterações nas originais (de onde foram copiadas) não serão refletidas aqui.
Como então trocar informações entre estas rotinas que estão rodando em paralelo?
Isto é possível através de uma combinação de recursos existentes no Magic xpa:
1) Eventos no Main Program
2) Contextos identificados
3) Raise Event direcionado
1) Definindo-se um evento no Main Program (CTRL+U), qualquer programa /tarefa pode criar um manipular (handler) para ele, ou dispará-lo (raise event).
2) Usando-se a função CtxSetName(…) pode-se definir uma identificação conhecida ao contexto (thread) atual
3) Usando-se o argumento Destination Context Name do comando Raise Event, pode-se definir um contexto/thread específico onde o evento deverá ser capturado.
Neste endereço <clique aqui> há um programa exemplo Magic xpa, onde uma mesma tabela é acessada por dois programas em paralelo: Consulta e Cadastro. Eles estão abertos (em execução) simultaneamente e à medida que alterações são realizadas no programa “Cadastro”, os dados são automaticamente refletidos/atualizados no programa “Consulta”.
Como funciona?
A) Um evento denominado “Sincroniza” foi definido no Main Program (CTRL+U)
B) O programa “Consulta” tem um handler para este evento, e neste handler ele realiza um Raise Event View Refresh
C) O programa “Consulta” define um nome para o seu contexto (TelaConsulta) logo no início, no seu Task Prefix.
D) O programa “Cadastro” realiza um Raise Event Sincroniza sempre que ele quer avisar que houve alteração de dados (neste exemplo foi escolhido o Record Prefix para isto). No Destination Context está definido TelaConsulta, e o Wait está NO (para não deixar este programa em espera até o outro processar o evento).
OBS: Este exemplo requer o Magic xpa 1.9g. Se não puser atualizá-lo, altere a definição do banco de dados da tabela, para poder rodar a aplicação.