Pular para o conteúdo principal

Postagem em destaque

BlackTDN :: LeetCode :: Comparando Implementações Harbour e TLPP para o Desafio Longest Palindromic Substring

_Créditos das imagens: ChatGPT_ ### LeetCode :: Comparando Implementações Harbour e TLPP para o Desafio Longest Palindromic Substring Resolver o problema do [Longest Palindromic Substring](https://leetcode.com/problems/longest-palindromic-substring/description/) é um exercício clássico de programação, que desafia desenvolvedores a encontrar a maior substring palindrômica dentro de uma string. Recentemente, exploramos soluções tanto em Harbour quanto em TLPP (Total Language Protheus Programming). Neste artigo, comparamos as implementações nessas duas linguagens, destacando suas semelhanças, diferenças e funcionalidades específicas. #### Implementações em Harbour ##### Versão 5.1 Essa solução utiliza a técnica de expansão a partir do centro do palíndromo. Cada caractere ou par de caracteres consecutivos é considerado um possível "centro". O algoritmo expande em ambas as direções enquanto os caracteres forem iguais, retornando o maior palíndromo encontrado. ##### Versão 5....

Protheus :: Estudo de Caso I (Threads)

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;

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


Selecione a Empresa para qual as Tabela serão importadas


Informe os Dados com a Conexão ao TopConnect de Origem dos Dados


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


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.

Comentários

  1. Naldo,

    estou 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

    ResponderExcluir

Postar um comentário

Postagens mais visitadas