Lançar um processo externo de forma assíncrona

Tradução automática de Deepl

Por vezes é necessário executar processos em segundo plano e, assim que se termina, executar algumas acções de acordo com o seu código de saída. A partir do v19 R4, 4D permite-lhe iniciar um processo em segundo plano com a nova classe 4D.SystemWorker e executar métodos de chamada de retorno automaticamente quando o processo retorna informação. Desta forma, a IU da sua aplicação mantém-se reactiva durante a execução do processo externo, e quando termina, pode exibir o resultado ao utilizador imediatamente!

Trabalhador do sistema HDI

Um SystemWorker é um objecto criado utilizando o construtor 4D.SystemWorker.new(processo). Cria um novo trabalhador que inicia o processo passado em parâmetro e espera até ao fim do mesmo.

Aqui estão alguns exemplos de como executar vários comandos de git usando um SystemWorker.

Vamos começar de forma simples e imaginemos que precisa de recuperar a versão do git instalada no seu computador. Tem duas formas de o fazer:

  • Se quiser fazê-lo de forma assíncrona, para deixar o seu cliente continuar a utilizar a interface livremente, basta usar uma chamada de retorno que será chamada no final do processo:
$param:=New object
// Close the process after 2s if not already terminated
$param.timeout:=2
// Callback formula called when the response is totaly received by the systemworker
$param.onResponse:=Formula(ALERT($1.response))
// Start the system worker with the parameter defined above
$sys:=4D.SystemWorker.new("git --version"; $param)
  • Se preferir esperar pela resposta do processo, basta utilizar .wait():
$param:=New object
// Close the process after 2s if not already terminated
$param.timeout:=2
// Start the system worker with the parameter defined above
$sys:=4D.SystemWorker.new("git --version";$param)

// Wait for the end or the process and return the response from Git
ALERT($sys.wait().response)

Vamos continuar com um compromisso que espera por uma mensagem de compromisso. Neste exemplo, o processo espera por uma entrada padrão. Se estiver numa consola, isso significa que a consola espera que o utilizador introduza um valor:

Nesses casos, pode utilizar a função .postMessage() para enviar a sua mensagem e a função .closeInput() para indicar ao processo que a mensagem é enviada:

$param:=New object
$param.currentDirectory:=$myProjectDirectory

$sys:=4D.SystemWorker.new("git commit -F -";$param)
$sys.postMessage("This is my first commit")
$sys.closeInput()

Como pode reparar, o trabalhador do sistema vai mais longe do que a função Launch external process comando. Permite iniciar processos de forma assíncrona e receber facilmente o outputStream e o errorStream do processo chamado. Além disso, pode utilizar uma nova forma de comunicar com o seu processo através da função postMessage().

Não se esqueça de testar esta funcionalidade com o IDH acima e aprender a utilizá-lo para iniciar vários processos em paralelo.

Consulte o centro de desenvolvimento para mais detalhes!

Fabrice Mainguené
- Proprietário do produto ->p>Fabrice Mainguené juntou-se à equipa do Programa 4D em Novembro, 2016. Como Proprietário do Produto, está encarregado de escrever as histórias dos utilizadores, traduzindo-as depois para especificações funcionais. O seu papel é também o de assegurar que a implementação da funcionalidade entregue vai ao encontro das necessidades do cliente.Após a obtenção da licenciatura em Informática no CNAM, Fabrice juntou-se a uma pequena empresa editora de software como programador Windev. Depois trabalhou para diferentes empresas nas áreas da indústria e comércio como programador Windev e web developer, bem como como consultor técnico sobre novas funcionalidades.