Encerrando conexões com a KillUser – Maratona AdvPL e TL++ 320

Nesse vídeo demonstraremos a utilização da função KillUser, que serve para encerrar determinada conexão (thread) com o sistema.

Abaixo o código fonte desenvolvido para o exemplo em vídeo acima:

//Bibliotecas
#Include "Protheus.ch"
 
/*/{Protheus.doc} User Function zExe320
Formata uma string justificando o texto
@type Function
@author Atilio
@since 25/02/2023
@see https://tdn.totvs.com/display/tec/KillUser
@obs 
    KillUser
    Parâmetros
        + UserName       , Caractere    , Nome do usuário conectado no SmartClient
        + ComputerName   , Caractere    , Nome do computador que esta com o SmartClient aberto
        + ThreadId       , Numérico     , Indica o número da Thread entre ao AppServer e SmartClient
        + ServerName     , Caractere    , Indica o servidor onde esta rodando o AppServer
    Retorno
        Função não tem retorno

    **** Apoie nosso projeto, se inscreva em https://www.youtube.com/TerminalDeInformacao ****
/*/

User Function zExe320()
    Local aArea      := GetArea()
    Local aThreads   := {}
    Local nConexAtu  := 1
    Local nTentativa := 1
    Local nMaxTenta  := 10
     
    //Pega todos os usuários conectados
    aThreads := GetUserInfoArray()
     
    //Enquanto houver tentativas para finalizar as threads
    While nTentativa <= nMaxTenta
        //Percorre todas as conexões
        For nConexAtu := 1 To Len(aThreads)
             
            //Se a thread da conexão atual for diferente da thread atual (senão vai matar o processo que mata todos)
            If aThreads[nConexAtu][3] != ThreadId()
                KillUser( aThreads[nConexAtu][1],; //UserName
                          aThreads[nConexAtu][2],; //ComputerName
                          aThreads[nConexAtu][3],; //ThreadId
                          aThreads[nConexAtu][4])  //ServerName
            EndIf
        Next
         
        //Pega novamente todos os usuários conectados
        aThreads := GetUserInfoArray()
         
        //Se ainda houver registros, aumenta a tentativa e espera 1 segundo
        If Len(aThreads) > 1
            nTentativa++
            Sleep(1000)
             
        //Senão finaliza o laço de repetição
        Else
            Exit
        EndIf
    EndDo
     
    RestArea(aArea)
Return

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

Deixe uma resposta

Terminal de Informação