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:
Estando no Ambiente para o qual deseja importar os dados Digite u_TcLinkData
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_uPuwMGGrx2Q4XHAaHyTPwDc4ePua8rgqkHaOL1UA1Q7mtUxmET1dL5ar4TXI8xjivsvTbesq-uPc0UeePiPIDm2gD0YskN-X0qCaBYoqoX54o4C6P9yKbVSeo-Dq5elfhcet1HVwFmU/s400-rw/u_TcLink01.JPG)
Selecione a Empresa para qual as Tabela serão importadas
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbbGoME2OgbkJt02sqTR-iOjrm-t9spudYdHsOkTOdvwU-pod03mnohPhRWkgfR7ktgf-hqLw4dUlWSz4UJLjxTVMuN7doBdeRwjZUXk-V8sVfUUTyh8m_nxbVog_MAbdJxJimBzMybg0/s400-rw/u_TcLink02.JPG)
Informe os Dados com a Conexão ao
TopConnect de Origem dos Dados
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhb1qK6kswA-xgrW1ibjmlguva7Ox6HdxueO3xWn17TvwEjE_S81_tufW8PBT3dsXzNBRElKX-WlD_aqu7xT1gGFdHA_xQ5O-rjS_u4IDB5xhYpIwjLLWaeZgJSj4rX1kMI5w6AgOxJCoc/s400-rw/u_TcLink03.JPG)
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)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrUJG9SDgYB7KCAD4dwdhFup3YT-AntYG3oTM_w-2zeG0m-Tul-Fa2z05K1hTz4ni0NDtHDm-ZPLgFLAZzAnvpmdaCwEbN1vJavojV90f9AXBDenzwUjF3I-1dfySFUNULxxAqxD5Kxc0/s400-rw/u_TcLink04.JPG)
Se Optou por filtrar as Tabelas, monte a expressão do Filtro.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpelc6bc3-wPKL5QYdT46Y__DyXQCudpLbwc9wUhkcTtzJpx9muw5P-N9PGoRVgkpxE0njMtpgr3NMUEh78EZVguhtKcfXWYfKLuOXyWcoALnZeIyJZiQjRh1N8-8SI9jFiidI46zNZso/s400-rw/u_TcLink05.JPG)
Se Optar por
selecionar as Tabelas a serem Exportadas
Selecione-as
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEih8bQirtXpOJQTGtKjsWxOghLsMjUQ7ZqQDMToyP4ZBEEHEpdeyCWIQo_AAG6XvaZW7K8Mao0yh0oWWTOTSysznCOcMuVjMvoHelPncEiCQmPPP7HN7u2f3NiOqtIKbjj2aTqpWckEd_k/s400-rw/u_TcLink07.JPG)
Se Desejar apenas as Tabelas com Dados, clique em "sim"
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLvSB5sAX_fbocJynNLRZIfcMCwQVp-3wDPNlrskI_4Hs2hQgNw9_i649HaO2hYgT31aOX4WDwM1CUn8smpmAKtjYUUEPj_Trr2jS2W3hfKAEl81vfNgLTyMaZ2AuzLZ2iR1vIecFD7dg/s400-rw/u_TcLink08.JPG)
Se existir a Tabela no Destino e desejar sobrescrever, clique em "Sim"
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOA4hQ4uTsCNwAeL8Qw6ne46gNwoO9Fx2Pmk6T55Pxm-gqhvkc0CW2_TpNaJF0Tw6XJf4K-SLDdIciHBDMMpHeDFg-fMfO14hZ4-cVKXZDE5jAo8mxaCEQbr_Y1Dwcod7lQ3jpdmnA-pU/s400-rw/u_TcLink09.JPG)
Aguarde pela Finalização das
Threads Pendentes
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhy0E1b_pHjn4u0hvEjBJhaY7cSgY-rEMzr6hRmhFu_9UvbqO7tJqgLxJaY_Srzkr-gBN85HjY8JsB9l2ZGeogz8L-P99R6t8cFAPul6D0aZlQ91pdrqGF-9KNA-EiT-5eVJYJfDGmN45E/s400-rw/u_TcLink10.JPG)
E o Processo terá se
concluido e Todas as
Threads Finalizadas
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8bel3SmbgGKAOlu_6A-_4VU_75ZHi7PTKCffitNmgXKYywoIzYCyc_lgrU6sd6qD96lPCJBgLuwCa5sM3RYa83JiIerBH0qorYbDLTAYZ93MSbiemdENiGX-95MbeOzoHSB4rB5fjzOA/s400-rw/u_TcLink11.JPG)
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