🚀 Oferecendo Serviços Remotos de Desenvolvedor AdvPL e Mais 🖥️ Olá pessoal, Espero que este post encontre todos vocês bem! É com grande entusiasmo que compartilho que estou expandindo meus serviços como Desenvolvedor AdvPL para novos desafios e colaborações. Com mais de duas décadas de experiência sólida, minha jornada profissional tem sido enriquecedora, com a oportunidade de participar de projetos empolgantes ao longo dos anos. Agora, estou ansioso para trazer minha experiência e habilidades para novas equipes e projetos, trabalhando de forma remota. Minha expertise abrange não apenas AdvPL, mas também outras tecnologias-chave, incluindo JS, SQL, Infraestrutura e Otimização de Processos. Acredito que essa combinação de conhecimentos me permite oferecer soluções abrangentes e eficazes para uma variedade de necessidades de desenvolvimento. Acredito que a tecnologia tem o poder de transformar negócios e impulsionar o sucesso, e estou comprometido em ajudar meus clientes a alcançar seu
No artigo anterior: Protheus :: Variáveis Globais, Threads e outros bichos fiz referência à função StartJob(). É essa função que nos possibilita criar Threads no Protheus. Seus parâmetros são:
cFunction -> Function ou Procedure a ser executada;
cFunction -> Function ou Procedure a ser executada;
cEnvironment -> Ambiente (configurado no .ini do server Protheus) que será utilizado para a execução da Function ou Procedure;
lWait -> Se deverá aguardar ou não o retorno da Thread. True (.T.) faz com que StartJob desvie as instruções para a Function que está sendo passada como parâmetro e aguarde a Finalização da Thread. False (.F.) faz com que uma nova Thread seja criada, com a chamada à função ou Procedimento, mas não agurada o seu retorno.
- Os demais correspontem a lista de parâmetros a serem enviados para a Função ou Procedimento a ser executado.
No nosso Estudo de Caso de hoje, mostrarei como importar tabelas usando várias Threads. O código surgiu de uma necessidade de transferir dados que estavam armazenados em Oracle, em uma versão do protheus, para uma base em PostGres em outra versão do Protheus.
Considerando que a estrutura do Dicionário de Dados (SX3) e, consequentemente, das tabelas eram diferentes entre uma versão e outra, e que não seria possível utilizar a importação através do APSDU/MPSDU, foi necessário criar uma nova aplicação para esse fim. Só que ela teria que ter algo a mais que o SDU, o SDU importa uma tabela por vez, e para importar cinco ou seis tabelas seria necessário abrir cinco ou seis intâncias do SDU. É ai que entra a função StartJob().
O Código u_TcLinkData.prg nos mostra como fazer isso. A sua utilização é bem simples, conforme demonstrado nas figuras abaixo:
O Código u_TcLinkData.prg nos mostra como fazer isso. A sua utilização é bem simples, conforme demonstrado nas figuras abaixo:
Estando no Ambiente para o qual deseja importar os dados Digite u_TcLinkData
Selecione a Empresa para qual as Tabela serão importadas
Se desejar "Filtrar" as Tabelas a serem Importadas, clique em "sim"
(caso contrário todas as tabelas do SX2 serão disponibilizadas para Importação)
Se Optou por filtrar as Tabelas, monte a expressão do Filtro.
Se Optar por selecionar as Tabelas a serem Exportadas
Selecione-as
Se Desejar apenas as Tabelas com Dados, clique em "sim"
Se existir a Tabela no Destino e desejar sobrescrever, clique em "Sim"
Aguarde pela Finalização das Threads Pendentes
E o Processo terá se concluido e Todas as Threads Finalizadas
(caso contrário todas as tabelas do SX2 serão disponibilizadas para Importação)
Se Optou por filtrar as Tabelas, monte a expressão do Filtro.
Se Optar por selecionar as Tabelas a serem Exportadas
Selecione-as
Se Desejar apenas as Tabelas com Dados, clique em "sim"
Se existir a Tabela no Destino e desejar sobrescrever, clique em "Sim"
Aguarde pela Finalização das Threads Pendentes
E o Processo terá se concluido e Todas as Threads Finalizadas
Atenção para o número de Threads em execução, poderá comprometer a performance e as licenças do Protheus. Observe que no cabeçalho do programa a seguinte constante é definida: #DEFINE __nMAX_THREADS__ 6, de forma a limitar o número de Threads em seis. Ou seja, mesmo que tenhamos selecionado mais de seis Tabelas a serem importadas, enquanto existirem seis Threads em execução as demais ficarão aguardando a liberaçao de Threads.
Naldo,
ResponderExcluirestou tentando implementar multi thread em um programa, mas aparentemente a função startjob não executa a rotina...
eu tenho que ter a função que será executada no startjob cadastrada no meu schedule?
obrigado