Verificar aplicativo/processo está rodando na memória

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

porter
Usuário Nível 5
Usuário Nível 5
Mensagens: 1057
Registrado em: 10 Dez 2009 16:44
Localização: OLIMPIA-SP

Verificar aplicativo/processo está rodando na memória

Mensagem por porter »

Olá Rubens,
Então vou tentar executar essa rotina sem o nKill para ver se dá certo,
Obrigado.
Avatar do usuário
carlaoonline
Usuário Nível 3
Usuário Nível 3
Mensagens: 190
Registrado em: 24 Ago 2014 22:38
Localização: Porto Alegre-RS

Verificar aplicativo/processo está rodando na memória

Mensagem 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
Avatar do usuário
JAIR RANGEL
Usuário Nível 3
Usuário Nível 3
Mensagens: 178
Registrado em: 19 Jul 2005 16:01
Localização: RIO DE JANEIRO
Contato:

Verificar aplicativo/processo está rodando na memória

Mensagem 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!
MINIGUI + HARBOUR + BRMAKE + CDX
CLIPPER 5.2E + VISUALLIB 2 + BLINKER
Responder