Clipper On Line • Ver Tópico - Verificar aplicativo/processo está rodando na memória

Verificar aplicativo/processo está rodando na memória

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

 

Verificar aplicativo/processo está rodando na memória

Mensagempor porter » 04 Abr 2018 17:10

Olá Rubens,
Então vou tentar executar essa rotina sem o nKill para ver se dá certo,
Obrigado.
porter
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 967
Data de registro: 10 Dez 2009 15:44
Cidade/Estado: OLIMPIA-SP
Curtiu: 3 vezes
Mens.Curtidas: 18 vezes

Verificar aplicativo/processo está rodando na memória

Mensagempor carlaoonline » 22 Mar 2021 15:10

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:
//-----------------------------------------------------------------------------
// 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:

//
// 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:

//
// 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 de usuário

carlaoonline
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 8
Data de registro: 24 Ago 2014 22:38
Cidade/Estado: Porto Alegre-RS
Curtiu: 0 vez
Mens.Curtidas: 0 vez

Verificar aplicativo/processo está rodando na memória

Mensagempor JAIR RANGEL » 31 Jul 2021 15:14

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
Avatar de usuário

JAIR RANGEL
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 171
Data de registro: 19 Jul 2005 16:01
Cidade/Estado: RIO DE JANEIRO
Curtiu: 1 vez
Mens.Curtidas: 2 vezes

Anterior



Retornar para MiniGui

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 2 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro