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!
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!