Páginas filhas
  • LGX - LTHREAD

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

Pagetitle
LTHREAD
LTHREAD
Executa funções 4GL a partir de uma nova THREAD de forma assíncrona.


Hierarquia



Sintaxe


Bloco de código
LET m_thread_reference = _ADVPL_create_component(NULL,"LTHREAD")

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).



Métodos GET


Inclusão de trecho
LTHREAD - Métodos GET
LTHREAD - Métodos GET
nopaneltrue

Métodos

...

acessíveis através da função _ADVPL_get_property que permite recuperar e manipular os valores do componente: 

Expandir
titleGET JOIN

Método GET: JOIN

Aguarda a finalização da THREAD.

Sintaxe


Bloco de código
_ADVPL_get_property(< l_reference >,"JOIN") => SMALLINT

Retorno


TipoDescrição
SMALLINTVerdadeiro para indicar a finalização da THREAD.

Exemplo


Bloco de código
linenumberstrue
#------------------------------------------------------------------------------#
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




Expandir
titleGET IS_ALIVE

Método GET: IS_ALIVE

Verifica se a THREAD atual está "viva", ou seja, em execução.

Sintaxe


Bloco de código
_ADVPL_get_property(< l_reference >,"IS_ALIVE") => SMALLINT

Retorno


TipoDescrição
SMALLINTVerdadeiro se a THREAD atual está em execução.

Exemplo


Bloco de código
linenumberstrue
#------------------------------------------------------------------------------#
FUNCTION LTHREAD_getISALIVE()
#------------------------------------------------------------------------------#
    DEFINE l_is_alive SMALLINT
    LET l_is_alive = _ADVPL_get_property(m_thread_reference,"IS_ALIVE")
END FUNCTION




Expandir
titleGET START

Método GET: START

Cria e inicia a execução de uma nova THREAD.

Sintaxe


Bloco de código
_ADVPL_get_property(< l_reference >,"START") => SMALLINT

Retorno


TipoDescrição
SMALLINTVerdadeiro se a THREAD foi criada e iniciada com sucesso.

Exemplo


Bloco de código
linenumberstrue
#------------------------------------------------------------------------------#
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.




Expandir
titleGET FTP_CONNECT

Método GET: F




Expandir
titleGET FTP_CONNECT

Método GET: F




Expandir
titleGET FTP_CONNECT

Método GET: F





Métodos SET


Inclusão de trecho
LTHREAD - Métodos SET
LTHREAD - Métodos SET
nopaneltrue

Exemplo


Expandir
titleExemplo de utilização

...

Sintaxe

Bloco de código
LET m_thread_reference = _ADVPL_create_component(NULL,"LTHREAD")

...

Bloco de código
linenumberstrue
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

...

Observações

...