Página 2 de 2

Verificar aplicativo/processo está rodando na memória

Enviado: 04 Abr 2018 17:10
por porter
Olá Rubens,
Então vou tentar executar essa rotina sem o nKill para ver se dá certo,
Obrigado.

Verificar aplicativo/processo está rodando na memória

Enviado: 22 Mar 2021 15:10
por carlaoonline
Boa tarde a todos !

Esse tópico é antigo e essa solução apresentada por mim também é mas sempre me serviu.

Ela verifica se o programa (executável) já está rodando .

No meu caso não usei passagem de nome de arquivo como parâmetro na função pois é para verificar sempre os os mesmos nomes: "A_MENU1.EXE" ou o conteúdo da variável "NOME_CLIENTE", mas é possível implementa-la da forma que quiser.

Ela consiste em rodar o tasklist.exe>arq_log.txt e depois lê esse arquivo.

Uso no windows 10 em março de 2021 e ainda funciona bem.


Primeiro a chamada para a função:

Código: Selecionar todos

//-----------------------------------------------------------------------------
// Aqui verifica o numero de vezes que esta aberto esse executavel e coloca um numero de referencia nele....
//-----------------------------------------------------------------------------
PUBLIC NOME_CLIENTE:="DINAMICA"
TEMPORARIO="ZYX_"


   NUMERO_DO_APP=VER_NUM_TELAS()
   IF NUMERO_DO_APP>3
      ALERT("N" + CHR( 163 ) + "mero de aberturas excedido.;Existem 3 telas abertas do sistema!")
      close all
      quit
   ENDIF
//-----------------------------------------------------------------------------

Agora a função:

Código: Selecionar todos

//
// Esta funcao varre o tasklist para ver se o programa ja esta rodando  
// Nesse caso o A_MENU1.EXE ou o contido variavel NOME_CLIENTE
//
FUNCTION VER_NUM_TELAS()
  local AA,BB,CC,DD,UM

   //--- Se existir um arquivo de LOG anterior, entao apaga ele
   AA=TEMPORARIO+"LOG.TXT"
   IF FILE(AA)  // NAO USAR LETO_FILE, eh para verificacao local
      ERASE &AA
   ENDIF
   
   //--- Monta a query
   AA="TASKLIST>"+TEMPORARIO+"LOG.TXT"
   
   //--- Executa a query
   //--- Colocando dentro do arquivo TXT de log a relacao de todos arquivos rodando no PC
   HB_RUN (AA)
   AA=TEMPORARIO+"LOG.TXT"
   UM=MEMOREAD(AA)
   CC=NOME_CLIENTE+".EXE"
   DD=0
   
   //--- AQUI verifica se ha outro programas abertos no computador local ------
   FOR F=1 TO MLCOUNT(UM,100)  // Quantidade de linhas (memoline) em UM ate 100 colunas.
       BB=MEMOLINE(UM,100,F)  // Atribui a BB ate 100 caracteres da linha F  do arquivo de LOG gerado
       IF "A_MENU1.EXE"$UPPER(BB) .OR. CC$UPPER(BB) // Verifica de nessa linha tem um dos arquivos mencionado
          DD++  // Se houver entao incrementa a variavel DD
          *ALERT("ENCONTRADA "+STR(DD)+" OCORRENCIA")
       ENDIF
   NEXT
   
   //--- Apaga o arquivo de LOG gerado.
   AA=TEMPORARIO+"LOG.TXT"
   IF FILE(AA)  // NAO USAR LETO_FILE, eh para verificacao local
      ERASE &AA
   ENDIF
   RETURN DD
Aqui a mesma função porém enxuta utilizando o comando Hb_ProcessRun:

Código: Selecionar todos

//
// Esta funcao varre o tasklist para ver se o programa ja esta rodando  
// Nesse caso o A_MENU1.EXE ou o contido variavel NOME_CLIENTE
//
FUNCTION VER_NUM_TELAS()
local AA, BB, CC:=NOME_CLIENTE+".EXE" , DD:=0 , UM:=""

//--- Aqui coloca o resultado do comando TASKLIST dos DOS na variavel UM
// nResult := hb_ProcessRun( cCommand, [cStdIn], [@cStdOut], [@cStdErr], [lDetach] )
AA= hb_processRun( "tasklist" ,, @UM,, .t. )
   
//--- AQUI verifica se ha outro programas abertos no computador local ------
FOR F=1 TO MLCOUNT(UM,100)  // Quantidade de linhas (memoline) em UM ate 100 colunas.
    BB=MEMOLINE(UM,100,F)  // Atribui a BB ate 100 caracteres da linha F  do arquivo de LOG gerado
    IF "A_MENU1.EXE"$UPPER(BB) .OR. CC$UPPER(BB) // Verifica de nessa linha tem um dos arquivos mencionado
        DD++  // Se houver entao incrementa a variavel DD
        *ALERT("ENCONTRADA "+STR(DD)+" OCORRENCIA")
    ENDIF
NEXT
 
RETURN DD

Verificar aplicativo/processo está rodando na memória

Enviado: 31 Jul 2021 15:14
por JAIR RANGEL
Boa tarde, Amigos

Mesmo o post sendo antigo, me senti na obrigação de passar aqui hoje para dizer que a rotina apresentada pelo Rubens funciona maravilhosamente bem...
É certo que não tentei decifrar todas as linhas da função, pois tem coisas ali que entortou a mente, mas funciona.

Abraço a todos e vamos em frente!