- Criado por Usuário desconhecido (rubens.santos), última alteração por Cleane Hermann em 23 jun, 2023
Sintaxe
LET m_thread_reference = _ADVPL_create_component(NULL,"LTHREAD")
Métodos GET
Métodos acessíveis através da função _ADVPL_get_property
que permite recuperar e manipular os valores do componente:
Método GET: JOIN
Aguarda a finalização da THREAD.
Sintaxe
_ADVPL_get_property(< l_reference >,"JOIN") => SMALLINT
Retorno
Tipo | Descrição |
---|---|
SMALLINT | Verdadeiro para indicar a finalização da THREAD. |
Exemplo
#------------------------------------------------------------------------------# FUNCTION LTHREAD_getJOIN() #------------------------------------------------------------------------------# DEFINE l_status SMALLINT # A partir deste ponto, a execução ficará "pausada" até que a execução da THREAD termine. LET l_status = _ADVPL_get_property(m_thread_reference,"JOIN") END FUNCTION
Método GET: IS_ALIVE
Verifica se a THREAD atual está "viva", ou seja, em execução.
Sintaxe
_ADVPL_get_property(< l_reference >,"IS_ALIVE") => SMALLINT
Retorno
Tipo | Descrição |
---|---|
SMALLINT | Verdadeiro se a THREAD atual está em execução. |
Exemplo
#------------------------------------------------------------------------------# FUNCTION LTHREAD_getISALIVE() #------------------------------------------------------------------------------# DEFINE l_is_alive SMALLINT LET l_is_alive = _ADVPL_get_property(m_thread_reference,"IS_ALIVE") END FUNCTION
Método GET: START
Cria e inicia a execução de uma nova THREAD.
Sintaxe
_ADVPL_get_property(< l_reference >,"START") => SMALLINT
Retorno
Tipo | Descrição |
---|---|
SMALLINT | Verdadeiro se a THREAD foi criada e iniciada com sucesso. |
Exemplo
#------------------------------------------------------------------------------# FUNCTION LTHREAD_getSTART() #------------------------------------------------------------------------------# DEFINE l_status SMALLINT DEFINE l_message CHAR(200) # Define a função que será executada numa nova THREAD. CALL _ADVPL_set_property(m_thread_reference,"FUNCTION","LTHREAD_testFunction") # Adiciona os parâmetros que serão enviados para a função. CALL _ADVPL_set_property(m_thread_reference,"CLEAR_PARAMETERS") CALL _ADVPL_set_property(m_thread_reference,"ADD_PARAMETER",p_user CLIPPED) CALL _ADVPL_set_property(m_thread_reference,"ADD_PARAMETER",p_cod_empresa CLIPPED) LET l_status = _ADVPL_get_property(m_thread_reference,"START") IF NOT l_status THEN LET l_message = _ADVPL_get_property(m_thread_reference,"ERROR_MESSAGE") CALL log0030_mensagem(l_message,"exclamation") END IF END FUNCTION
Observação
- Para recuperar a mensagem de erro, no caso da execução não ter sido iniciada, utilize o método ERROR_MESSAGE.
Método GET: ERROR_MESSAGE
Retorna a mensagem de erro ocorrida durante a criação ou execução da THREAD.
Sintaxe
_ADVPL_get_property(< l_reference >,"ERROR_MESSAGE") => CHAR
Retorno
Tipo | Descrição |
---|---|
CHAR | Mensagem de erro detalhando a inconsistência ocorrida na execução da THREAD. |
Exemplo
#------------------------------------------------------------------------------# FUNCTION LTHREAD_getERRORMESSAGE() #------------------------------------------------------------------------------# DEFINE l_status SMALLINT DEFINE l_message CHAR(200) # Define a função que será executada numa nova THREAD. CALL _ADVPL_set_property(m_thread_reference,"FUNCTION","LTHREAD_testFunction") # Adiciona os parâmetros que serão enviados para a função. CALL _ADVPL_set_property(m_thread_reference,"CLEAR_PARAMETERS") CALL _ADVPL_set_property(m_thread_reference,"ADD_PARAMETER",p_user CLIPPED) CALL _ADVPL_set_property(m_thread_reference,"ADD_PARAMETER",p_cod_empresa CLIPPED) LET l_status = _ADVPL_get_property(m_thread_reference,"START") IF NOT l_status THEN LET l_message = _ADVPL_get_property(m_thread_reference,"ERROR_MESSAGE") CALL log0030_mensagem(l_message,"exclamation") END IF END FUNCTION
Método GET: DEBUG_MODE
Retorna o modo de DEBUG atual em uso pela THREAD a ser executada.
Sintaxe
_ADVPL_get_property(< l_reference >,"DEBUG_MODE") => SMALLINT
Retorno
Tipo | Descrição |
---|---|
SMALLINT | Modo de DEBUG em uso para a Thread. |
Exemplo
#------------------------------------------------------------------------------# FUNCTION LTHREAD_getDebugMode() #------------------------------------------------------------------------------# DEFINE l_debugMode SMALLINT LET l_debugMode = _ADVPL_get_property(m_thread_reference,"DEBUG_MODE") END FUNCTION
Método GET: DEBUG_PATH
Retorna a pasta de destino, no disco do servidor onde o AppServer está em execução, para geração do arquivo de LOG com mensagens de DEBUG durante a execução da função na nova THREAD.
Sintaxe
_ADVPL_get_property(< l_reference >,"DEBUG_PATH") => CHAR
Retorno
Tipo | Descrição |
---|---|
CHAR | Caminho completo da pasta no Servidor de Aplicação onde o arquivo de LOG DEBUG deve ser gerado. |
Exemplo
#------------------------------------------------------------------------------# FUNCTION LTHREAD_getDebugPath() #------------------------------------------------------------------------------# DEFINE l_debugMode CHAR(300) LET l_debugPath = _ADVPL_get_property(m_thread_reference,"DEBUG_PATH") END FUNCTION
Método GET: RETURN_VALUE
Recupera o retorno da função executada pela nova Thread quando a propriedade WAIT_RUN estiver com valor TRUE, indicando que deverá aguardar o término da execução da função da Thread.
Sintaxe
_ADVPL_get_property(< l_reference >,"RETURN_VALUE") => UNDEFINED
Retorno
Tipo | Descrição |
---|---|
UNDEFINED | Recupera o valor retornado pela função indicada na execução da Thread, podendo ser do tipo DATE, CHAR, INTEGER, etc. |
Exemplo
#------------------------------------------------------------------------------# FUNCTION LTHREAD_getReturnValue() #------------------------------------------------------------------------------# DEFINE l_value CHAR(30) DEFINE l_status SMALLINT LET l_status = _ADVPL_get_property(m_thread_reference,"START") IF NOT l_status THEN LET l_message = _ADVPL_get_property(m_thread_reference,"ERROR_MESSAGE") CALL log0030_mensagem(l_message,"exclamation") ELSE LET l_value = _ADVPL_get_property(m_thread_reference,"RETURN_VALUE") END IF END FUNCTION
Métodos SET
Métodos acessíveis através da função _ADVPL_set_property
que permite alterar e manipular os valores do componente:
Método SET: FUNCTION
Define a função que será executada em uma nova THREAD.
Sintaxe
CALL _ADVPL_set_property(< l_reference >,"FUNCTION", < l_function >, [< l_type >])
Parâmetros
Nome | Tipo | Descrição | Obrigatório? | Padrão |
---|---|---|---|---|
l_function | CHAR | Função 4GL que será executada em uma nova THREAD. | Sim | |
l_type | CHAR | Tipo da função a ser executada. 4GL - Rotina com ou sem interface 4GL. INTEROP - Rotina com interface Metadado ou Freeform, onde a rotina está compilada como uma função 4GL. ADVPL - Rotina com ou sem interface ADVPL, onde a rotina principal está compilada como uma função ADVPL. | Não | 4GL |
Exemplo
#------------------------------------------------------------------------------# FUNCTION LTHREAD_setFUNCTION() #------------------------------------------------------------------------------# CALL _ADVPL_set_property(m_thread_reference,"FUNCTION","LTHREAD_testFunction","INTEROP") END FUNCTION
Método SET: CLEAR_ENVIRONMENTS
Limpa as variáveis de ambiente definidas anteriormente.
Sintaxe
CALL _ADVPL_set_property(< l_reference >,"CLEAR_ENVIRONMENTS")
Exemplo
#------------------------------------------------------------------------------# FUNCTION LTHREAD_setCLEARENVIRONMENTS() #------------------------------------------------------------------------------# CALL _ADVPL_set_property(m_thread_reference,"CLEAR_ENVIRONMENTS") END FUNCTION
Método SET: ADD_ENVIRONMENT
Define uma nova variável de ambiente que será considerada na execução da nova THREAD.
Sintaxe
CALL _ADVPL_set_property(< l_reference >,"ADD_ENVIRONMENT", < l_variable >, < l_value >)
Parâmetros
Nome | Tipo | Descrição | Obrigatório? | Padrão |
---|---|---|---|---|
l_variable | CHAR | Nome da variável de ambiente. | Sim | |
l_value | CHAR | Valor da variável de ambiente. | Sim |
Exemplo
#------------------------------------------------------------------------------# FUNCTION LTHREAD_setADDENVIRONMENT() #------------------------------------------------------------------------------# CALL _ADVPL_set_property(m_thread_reference,"ADD_ENVIRONMENT","NUM_PROCESSO","00123") END FUNCTION
Método SET: CLEAR_PARAMETERS
Limpa os parâmetros definidos anteriormente.
Sintaxe
CALL _ADVPL_set_property(< l_reference >,"CLEAR_PARAMETERS")
Exemplo
#------------------------------------------------------------------------------# FUNCTION LTHREAD_setCLEARPARAMETERS() #------------------------------------------------------------------------------# CALL _ADVPL_set_property(m_thread_reference,"CLEAR_PARAMETERS") END FUNCTION
Método SET: ADD_PARAMETER
Adiciona um novo parâmetros que será enviado para a função definida para execução em uma nova THREAD.
Sintaxe
CALL _ADVPL_set_property(< l_reference >,"ADD_PARAMETER", < l_value >)
Parâmetros
Nome | Tipo | Descrição | Obrigatório? | Padrão |
---|---|---|---|---|
l_value | CHAR | Valor do parâmetro. | Sim |
Exemplo
#------------------------------------------------------------------------------# FUNCTION LTHREAD_setADDPARAMETER() #------------------------------------------------------------------------------# CALL _ADVPL_set_property(m_thread_reference,"ADD_PARAMETER","admlog") END FUNCTION
Método SET: PROCESS_TYPE
Define o tipo da função que será executada em uma nova THREAD.
Sintaxe
CALL _ADVPL_set_property(< l_reference >,"PROCESS_TYPE", < l_type >)
Parâmetros
Nome | Tipo | Descrição | Obrigatório? | Padrão |
---|---|---|---|---|
l_type | CHAR | Tipo da função a ser executada. 4GL - Rotina com ou sem interface 4GL. INTEROP - Rotina com interface Metadado ou Freeform, onde a rotina está compilada como uma função 4GL. ADVPL - Rotina com ou sem interface ADVPL, onde a rotina principal está compilada como uma função ADVPL. | Sim | 4GL |
Exemplo
#------------------------------------------------------------------------------# FUNCTION LTHREAD_setProcessType() #------------------------------------------------------------------------------# CALL _ADVPL_set_property(m_thread_reference,"PROCESS_TYPE","ADVPL") END FUNCTION
Método SET: DEBUG_MODE
Define o modo de DEBUG assumido durante a execução da função na nova THREAD.
Sintaxe
CALL _ADVPL_set_property(< l_reference >,"DEBUG_MODE", < l_debug_mode >)
Parâmetros
Nome | Tipo | Descrição | Obrigatório? | Padrão |
---|---|---|---|---|
l_debug_mode | SMALLINT | Indicador de geração de LOG de mensagens para o processamento realizado durante a Thread. 0 - (PADRÃO) Inativo. 1 - DEBUG SQL + DEBUG Framework. Ativo para geração de instruções SQLs executadas durante o processamento das aplicações e ativo também para geração de mensagens de Debug emitidas pela função LOG_consoleDebugMessage. 2 - PROFILER + DEBUG Framework. Ativo para geração de instruções PROFILER, utilizado para avaliar performance de processamento das aplicações e ativo também para geração de mensagens de Debug emitidas pela função LOG_consoleDebugMessage. 3 - DEBUG Framework. Ativo para geração de mensagens de Debug emitidas pela função LOG_consoleDebugMessage. Para mais informações a respeito do modo de debug, acesse Chaves de Profile - Geração de LOG com Debug - Chave LOGIX.DEBUG | Sim | 4GL |
Exemplo
#------------------------------------------------------------------------------# FUNCTION LTHREAD_setDebugMode() #------------------------------------------------------------------------------# #Ativar o modo DEBUG para 1 (DEBUG SQL + DEBUG Framework) CALL _ADVPL_set_property(m_thread_reference,"DEBUG_MODE",1) END FUNCTION
Método SET: DEBUG_PATH
Define a pasta de destino, no disco do servidor onde o AppServer está em execução, para geração do arquivo de LOG com mensagens de DEBUG durante a execução da função na nova THREAD.
Sintaxe
CALL _ADVPL_set_property(< l_reference >,"DEBUG_PATH", < l_debug_path >)
Parâmetros
Nome | Tipo | Descrição | Obrigatório? | Padrão |
---|---|---|---|---|
l_debug_path | CHAR | Caminho completo da pasta no Servidor de Aplicação onde o arquivo de LOG DEBUG deve ser gerado. Por padrão de desenvolvimento a pasta de destino SEMPRE deverá estar localizada numa subpasta abaixo da pasta indicada como ROOTPATH do AppServer. | Sim |
Exemplo
#------------------------------------------------------------------------------# FUNCTION LTHREAD_setDebugPath() #------------------------------------------------------------------------------# CALL _ADVPL_set_property(m_thread_reference,"DEBUG_PATH","c:\\totvs\\logix\\temp\\log\\debug\\arquivolog.log") END FUNCTION
Método SET: ENVIRONMENT
Define o ambiente em que a nova THREAD deverá ser executada no AppServer, caso exista necessidade de indicar um ambiente diferente do ambiente atual em que o processo está em execução.
Sintaxe
CALL _ADVPL_set_property(< l_reference >,"ENVIRONMENT", < l_environment >)
Parâmetros
Nome | Tipo | Descrição | Obrigatório? | Padrão |
---|---|---|---|---|
l_environment | CHAR | Nome do ambiente onde a execução da nova Thread será realizada no AppServer. Este método somente é utilizado quando houver necessidade de executar uma função/processo em um ambiente diferente do ambiente atual em uso/execução. | Sim |
Exemplo
#------------------------------------------------------------------------------# FUNCTION LTHREAD_setEnvironment() #------------------------------------------------------------------------------# #Ajustar para que a nova thread seja executada no ambiente [integracoes] configurado no arquivo INI do AppServer em uso. CALL _ADVPL_set_property(m_thread_reference,"ENVIRONMENT","integracoes") END FUNCTION
Método SET: WAIT_RUN
Define se deve aguardar ou não o término da execução da função indicada na Thread antes de continuar a executar as próximas instruções.
Sintaxe
CALL _ADVPL_set_property(< l_reference >,"WAIT_RUN", < l_wait_run >)
Parâmetros
Nome | Tipo | Descrição | Obrigatório? | Padrão |
---|---|---|---|---|
l_wait_run | SMALLINT | Indicador para aguardar ou não o término de execução da Thread para continuar a executar as próximas instruções. TRUE - Aguardar o término da execução da função indicada na Thread. FALSE - Não aguardar o término da execução da função indicada na Thread. Neste caso, ao invocar o método START, o processo não irá aguadar o término da Thread para continuar processando as demais instruções da rotina em execução. | Sim | FALSE |
Exemplo
#------------------------------------------------------------------------------# FUNCTION LTHREAD_setWaitRun() #------------------------------------------------------------------------------# CALL _ADVPL_set_property(m_thread_reference,"WAIT_RUN","FALSE") CALL _ADVPL_set_property(m_thread_reference,"START") #Como foi indicada propriedade WAIT_RUN como FALSE para a nova thread, ao iniciar a execução da nova thread usando a propriedade START, #o processo não irá aguardar o término da execução da função da nova thread para continuar a executar as próximas instruções após START. ...instruções após START... END FUNCTION
Método SET: ADD_FINISH_EVENT
Adiciona uma função 4GL a ser executa após o término da execução da função indicada para a nova THREAD,ou seja, antes de finalizar a nova Thread todas funções adicionadas através desta propriedade serão executadas.
Sintaxe
CALL _ADVPL_set_property(< l_reference >,"ADD_FINISH_EVENT", < l_function >)
Parâmetros
Nome | Tipo | Descrição | Obrigatório? | Padrão |
---|---|---|---|---|
l_function | CHAR | Nome do função 4GL que será executada ao término da execução da função indidada para a nova Thread. Esta função é executada ainda na Thread, antes dela ser finalizada no AppServer. | Sim |
Exemplo
#------------------------------------------------------------------------------# FUNCTION LTHREAD_setAddFinishEvent() #------------------------------------------------------------------------------# #Acionar a função xxxnnnn_finishThread() antes de finalizar a Thread no AppServer. CALL _ADVPL_set_property(m_thread_reference,"ADD_FINISH_EVENT","xxxnnnn_finishThread") END FUNCTION
Observações
- É possível determinar a quantidade máxima de THREADs que serão executadas a partir de uma THREAD pai, para não sobrecarregar o servidor de aplicação, através da Chave de PROFILE
logix.threads.max
. - É possível emitir mensagens de LOG específicas deste componente, auxiliando em testes ou em resoluções de problemas, para isso a chave de PROFILE
logix.threads.debug
precisa estar definida com o valor 1 (ligado).
Exemplo
Clique no link na lateral direita para expandir o código de exemplo.
DATABASE logix GLOBALS DEFINE p_user LIKE usuarios.cod_usuario DEFINE p_cod_empresa LIKE empresa.cod_empresa END GLOBALS #------------------------------------------------------------------------------# FUNCTION LTHREAD_test() #------------------------------------------------------------------------------# DEFINE l_thread_reference VARCHAR(10) DEFINE l_status SMALLINT DEFINE l_is_alive SMALLINT DEFINE l_message CHAR(200) IF LOG_initApp("PADRAO") <> 0 THEN RETURN END IF # Cria o componente para requisições REST. LET l_thread_reference = _ADVPL_create_component(NULL,"LTHREAD") # Define a função que será executada numa nova THREAD. CALL _ADVPL_set_property(l_thread_reference,"FUNCTION","LTHREAD_testFunction") # Adiciona os parâmetros que serão enviados para a função. CALL _ADVPL_set_property(l_thread_reference,"CLEAR_PARAMETERS") CALL _ADVPL_set_property(l_thread_reference,"ADD_PARAMETER",p_user CLIPPED) CALL _ADVPL_set_property(l_thread_reference,"ADD_PARAMETER",p_cod_empresa CLIPPED) # Inicia a execução da função em uma nova THREAD. LET l_status = _ADVPL_get_property(l_thread_reference,"START") IF l_status THEN # Verifica se a THREAD está em execução. LET l_is_alive = _ADVPL_get_property(l_thread_reference,"IS_ALIVE") IF l_is_alive THEN CALL log0030_mensagem("Is Alive? Sim!","info") ELSE CALL log0030_mensagem("Is Alive? Não!","excl") END IF # Aguarda até o término da THREAD. CALL _ADVPL_get_property(l_thread_reference,"JOIN") CALL log0030_mensagem("THREAD finalizada","info") ELSE # Recupera a mensagem de erro. LET l_message = _ADVPL_get_property(l_thread_reference,"ERROR_MESSAGE") CALL log0030_mensagem(l_message,"stop") END IF # Ao finalizar o uso, libera o componente da memória. CALL _ADVPL_destroy_component(l_thread_reference) END FUNCTION #------------------------------------------------------------------------------# FUNCTION LTHREAD_testFunction(l_cod_usuario,l_cod_empresa) #------------------------------------------------------------------------------# DEFINE l_val_env CHAR(50) DEFINE l_cod_usuario CHAR(08) DEFINE l_cod_empresa CHAR(02) IF LOG_initApp("PADRAO") = 0 THEN LET l_val_env = LOG_getEnv("IPLOCAL_LGX") CALL CONOUT("IPLOCAL_LGX: "||l_val_env CLIPPED) LET l_val_env = LOG_getEnv("LTHREAD_CMP") CALL CONOUT("LTHREAD_CMP: "||l_val_env CLIPPED) CALL CONOUT("USUARIO....: "||l_cod_usuario CLIPPED) CALL CONOUT("EMPRESA....: "||l_cod_empresa CLIPPED) # Aguarda 5 segundos para que o teste do IS_ALIVE funcione. SLEEP 5 END IF END FUNCTION