O nosso próprio VP de Engenharia, Laurent Esnault, explica a troca de informação entre múltiplos processos E entre processos e formulários durante a sua Sessão de Intervalo: Preemptive Multi-threading na Cimeira 4D de 2016. Graças à multi-tarefa preventiva, é possível ter mais processos paralelos, e assim adicionar cada vez mais utilizadores, quer para aplicações desktop quer para aplicações web.
Se perdeu a sessão de Laurent na Cimeira 4D de 2016, veja este vídeo de 15 minutos e desfrute de alguma formação pessoal pelo mestre da multi-treading preventiva!
Pré-requisitos
Para tirar partido da multi-tarefa preventiva, terá de utilizar:
- apenas 64 bits
- modo compilado
- apenas comando de prontidão preventiva
- Sem variáveis interprocessadas
- Sem interface de utilizador
Mas não tenha medo! Temos algumas soluções poderosas e fáceis que vamos apresentar em detalhe com exemplos ilustrativos.
Como partilhar informações entre processos
Se não tem variáveis inter-processos em modo preventivo, como partilha a informação entre processos? É por isso que estamos a introduzir um novo conceito: “trabalhadores”. Mas o que é exactamente um “trabalhador”?
Ainda bem que perguntou! É uma caixa de mensagens associada a um processo especificamente dedicado a executar as suas mensagens. Usando o comando CALL WORKER pode enviar uma mensagem de um processo para outro (para lhe enviar informação, ou pedir-lhe que faça alguma coisa). A sintaxe deste comando é bastante semelhante à do comando New process por exemplo, pode passar qualquer parâmetro e/ou método de projecto.
Vamos usar uma pequena animação para compreender melhor o seu funcionamento:
Neste exemplo, queremos passar informação do processo de candidatura para o processo myWorker. O processo de candidatura está em curso e o processo myWorker está em pausa.
- No processo de candidatura, a CALL WORKER é chamado para passar alguns parâmetros a myWorker, e queremos que myWorker execute o método de projecto myMethod.
- Cria uma mensagem que é afixada de forma assíncrona a uma caixa de mensagens dedicada ao processo myWorker. A bandeira é hasteada, pelo que o trabalhador desperta e apanha automaticamente a mensagem, recupera o conteúdo (os parâmetros) e executa o myMethod.
- Quando o processo myWorker tiver terminado de executar o myMethod, ele não morre. É apenas pausado, à espera de outra mensagem para executar. Esta é a principal diferença em relação ao método New process que cria um processo, executa um método com alguns parâmetros, depois morre.
Então quando é que um trabalhador morre? Basicamente, morrerá quando fechar a aplicação ou se chamar o comando KILL WORKER comando. Não mata abruptamente o processo, apenas envia uma mensagem ao trabalhador pedindo-lhe para cometer suicídio.
Demonstração: Trabalhadores
Veja o exemplo da base de dados utilizada para a demonstração com as correspondentes explicações no posto de Vanessa sobre os trabalhadores.
Como aceder à interface de utilizador a partir de processos preventivos
Há pouco, dissemos que não se pode aceder à interface do utilizador a partir de um processo preventivo. Obviamente, precisávamos de fornecer uma solução para isso. Daí, a introdução do CALL FORM comando. Este comando é semelhante ao comando CALL WORKER comando. Desta vez, porém, não é uma caixa de mensagem associada a um processo, é uma caixa de mensagem associada a uma janela.
CALL FORM permite enviar uma mensagem a uma janela para pedir o formulário que corre dentro dela para executar um método com alguns parâmetros.
Vamos usar novamente uma pequena animação para demonstrar o conceito:
Neste exemplo, de dentro de um processo (que poderia ser preventivo) ou de um trabalhador, queremos fazer algo de forma corrente no mesmo processo ou noutro processo.
- Chamamos o comando CALL FORM e passar o número de referência da janela(ou seja, o valor int longo devolvido pelo Open form window ) no parâmetro de entrada, como o método de projecto que queremos executar(myMethod) com alguns parâmetros.
- Cria uma mensagem que é afixada de forma assíncrona numa caixa de mensagens associada à janela.
- O processo de manipulação da janela detecta automaticamente que tem uma mensagem. Recolhe a mensagem e executa o método myMethod e os seus parâmetros.
- Depois o processo continua a manipular a janela “como habitualmente” (manipulação de eventos como tecla para baixo, rato para baixo, etc.).
Como se pode ver, isto é bastante semelhante ao exemplo anterior sobre trabalhadores.
Demonstração: mensagens entre formulários
Consulte a base de dados de exemplo utilizada para a demonstração com as explicações correspondentes no post da Vanessa sobre o envio de mensagens entre formulários.