Detectar se o sistema estah em uso

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

marcos.gurupi
Usuário Nível 4
Usuário Nível 4
Mensagens: 939
Registrado em: 06 Jul 2004 11:53
Localização: Gurupi-TO

Detectar se o sistema estah em uso

Mensagem por marcos.gurupi »

Caros, eh possivel em xhb saber se o sistema estah sendo usado? Preciso dessa informacao para q quando nao estiver sendo usado e houver uma atualizacao pronta um sistema em sytray derrume o sistema para ser atualizado. Obrigado.
Marcos Roberto
NetService Software
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Detectar se o sistema estah em uso

Mensagem por Maligno »

Uma idéia é usar MUTEX. Buscando no fórum é possível encontrar um tópico que parece explicar bem o uso deste recurso. Clique aqui.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
marcos.gurupi
Usuário Nível 4
Usuário Nível 4
Mensagens: 939
Registrado em: 06 Jul 2004 11:53
Localização: Gurupi-TO

Detectar se o sistema estah em uso

Mensagem por marcos.gurupi »

O createMutex eu uso no meu sistema, mas apenas para saber se ele estah aberto, eu preciso de saber se o sistema estah sendo usado em execucao, ou seja, se o usuario estah usando de fato usando o sistema ou se ele estah apenas aberto, pq imagina se o usuario estiver criando um relatorio ou incluindo um cliente/produto e derrepente o sistema eh derrubado. Entaum eu preciso nao apenas se o sistema estah aberto mas em uso. Obrigado pela dica Maligno.
Marcos Roberto
NetService Software
MARINI
Usuário Nível 3
Usuário Nível 3
Mensagens: 288
Registrado em: 06 Jul 2004 08:06
Localização: Pindamonhangaba SP

Detectar se o sistema estah em uso

Mensagem por MARINI »

Marcos, com Xailer uso assim, acho que se você adaptar vai te resolver:

Código: Selecionar todos

FUNCTION IsExeRunning(tcName, tlTerminate)
  LOCAL loLocator, loWMI, loProcesses, loProcess, llIsRunning:=.F.
  tlTerminate:=IF(tlTerminate=NIL,.F.,tlTerminate)
  TRY
    loLocator := CREATEOBJECT('WBEMScripting.SWBEMLocator')
    loWMI := loLocator:ConnectServer()
    loWMI:Security_:ImpersonationLevel = 3  && Impersonate
    loProcesses := loWMI:ExecQuery([SELECT * FROM Win32_Process WHERE Name = '] + tcName + ['])
    llIsRunning := .F.
    IF loProcesses:Count > 0
      FOR EACH loProcess in loProcesses
        llIsRunning := .T.
        IF tlTerminate
          loProcess:Terminate(0)
        ENDIF
      NEXT
    ENDIF
  CATCH
    RETURN .F.
  END
RETURN llIsRunning
Abraços.
Mário
Sds
Marini
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Detectar se o sistema estah em uso

Mensagem por Itamar M. Lins Jr. »

Lembrei lá dos tempos do SCO UNIX e Novell...
Shutdown mandando a msg para as estações...

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Detectar se o sistema estah em uso

Mensagem por sygecom »

O sistema em si não sei se vai conseguir, a não ser que crie um TIMER para ficar registrando isso em uma determinada tabela sua ou arquivo.
Outra opção é pegar a inatividade do Windows usando GETINPUTSTATE()
Ou pelos processos do Windows se está mudando o consumo de memoria ou CPU, sei lá...da para brincar com isso.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Detectar se o sistema estah em uso

Mensagem por rochinha »

Amiguinhos,

A idéia de derrubar aplicativo alheio não é boa prática. Pois voce teria de definir dentro do seu sistema, quando uma operação é critica que não permite o desligamento e nunca irá saber quando o usuário entrou numa operação critica, mas antes de sair foi ao banheiro ou está ao telefone anotando pedido ou conversando com a namorada num chat.

O melhor é que voce faça o seguinte:

- Crie um executor padrão, ou seja, sistema.exe
- Faça o executor verificar um arquivo texto contendo a versão de build.
- A operação de verificação, fará o alerta ao usuário de que precisa atualizar pois nova versão está liberada.
- O executor sempre será o aplicativo do atalho, mas ele executará o build de numero XXX gravado no arquivo texto.

Código: Selecionar todos

...
cBuild := MemoRead( "build.txt" )
...
RUN( "sistema." + cBuild + ".exe" )
Conteúdo de um build.txt:

Código: Selecionar todos

2058
O seu executor, ficando em tray poderá ter as opções, abrir, fechar, minimizar, atualizar, onde:

Abrir - irá executar o build trazendo-o para a memória.
Fechar - irá fechar o build mantendo o executor ativo.
Minimizar - irá esconder o build de vista.
Atualizar - baixar da internet um build que ainda não exista na maquina do cliente.

Como criar o seu build.txt?

Toda vez que compilar o seu sistema incremente e grave o número no arquivo .txt. Distribua-o com o sistema.exe, sendo que os arquivos que deverão existir são:

sistema.exe
sistema.XXXX.exe
build.txt
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
toya
Usuário Nível 3
Usuário Nível 3
Mensagens: 157
Registrado em: 26 Jul 2004 16:51
Localização: Campo Grande/MS - Brasil
Contato:

Detectar se o sistema estah em uso

Mensagem por toya »

Código: Selecionar todos

function EstaRodandoKillExe( _cExe, _nKill )  
/*  
* Verificar se um Exe está sendo executado e podendo até derrubá-lo 
* Parametros: _cExe, _nKill
* Retorno: Retorno - .t. se estiver rodando  
*  
* Autor: toya  
*/
local Retorno := .f.
local oScriptObj
local oWmiService
local oListaProcess
local oProcessos
  
DEFAULT _nKill := 0

TRY
	oScriptObj  := CREATEOBJECT( "wbemScripting.SwbemLocator" )
   oWmiService := oScriptObj:ConnectServer()
CATCH
   return Retorno
END

TRY
	oListaProcess := oWmiService:ExecQuery( "select * from Win32_Process where Name='" + _cExe + "'" )
CATCH
   return Retorno
END

for Each oProcessos in oListaProcess
	Retorno := .t.
   if _nKill == 2
    	oProcessos:Terminate()  // mata o _cEXE
   endif
next

return Retorno

Elcio Carlos
(toya)
Ahora en la version 6.5
toyasis@gmail.com (e-mail)
toyaskype (skype)
http://www.toyanet.com.br
https://www.facebook.com/profile.php?id=100009195956044

FWH 11.8+PellesC+xHarbour.org 1.2.1+SqlRDD
Clippeiro por opção, Fivewiner por amor ao Clipper...
2015 - Iniciante/Aprendiz de HMG...
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Detectar se o sistema estah em uso

Mensagem por sygecom »

Acho que o Marcos está querendo é saber se tem alguma tela do sistema dele está sendo usada ou não, e não simplesmente se está aberto.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Detectar se o sistema estah em uso

Mensagem por rochinha »

Amiguinhos,
Acho que o Marcos está querendo é saber se tem alguma tela do sistema dele está sendo usada ou não, e não simplesmente se está aberto.
Imaginem-se, programando no cliente ou remotamente, voce faz alterações no sistema e envia ao servidor e na hora de atualizar o executável acontece impedimento de escrita, mas ai voce tem de pedir a um usuario que saia de maquina em maquina fechando o sistema, mas em um terminal alguém esta executando um pedido, algo que demore.

Ele precisa saber não se o sistema esta em uso, mas se o usuário esta fazendo algo demorado ou critico.

Sem uma programação mais auditada não tem como. E como seria esta auditoria? uma pequena tabela de log gravaria a posição do usuário e de posse desta tabela saber o que cada usuário faz e derrubar o aplicativo usando os métodos que todos exemplificaram.

O caso que propuz, foi o de não ser necessário nada disto, nenhuma preocupação com o que o usuário está fazendo e sem precisar da ajuda de usuário ao telefone.

Altera o sistema, cria o controle de build e envia os dois arquivos para o cliente.

Inclusive vou colocar em prática, já.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
marcos.gurupi
Usuário Nível 4
Usuário Nível 4
Mensagens: 939
Registrado em: 06 Jul 2004 11:53
Localização: Gurupi-TO

Detectar se o sistema estah em uso

Mensagem por marcos.gurupi »

Eh o "x" da questao eh saber se o usuario estah usando o sistema , ou ele estah simplesmente aberto sem uso. O exemplo do colega Toya apenas verifica se ele estah aberto. Imagina o usario com um pedido grande aberto e o sistema fecha sem aviso para atualizar? O kra me "demite" por justa causa. :)
Marcos Roberto
NetService Software
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Detectar se o sistema estah em uso

Mensagem por sygecom »

Marcos,
Isso não tem jeito, você terá que criar essa rotina dentro do seu sistema para poder saber se está ou não sendo usado.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
marcos.gurupi
Usuário Nível 4
Usuário Nível 4
Mensagens: 939
Registrado em: 06 Jul 2004 11:53
Localização: Gurupi-TO

Detectar se o sistema estah em uso

Mensagem por marcos.gurupi »

Perfeito, para evitar fazer alteracoes no retaguarda e no PDV eu vou perguntar ao usuario se ele quer q seja atualizado <SIM> ou <NAO>, se o usuario escolher sim o proprio sistema derruma o executavel e faz a atualizacao. Obrigado a todos.
Marcos Roberto
NetService Software
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Detectar se o sistema estah em uso

Mensagem por asimoes »

Eu ainda prefiro o método de enviar mensagem insistindo que o usuário saia para atualizar o sistema.
Derrubar o sistema pode acarretar problemas de integridade de registros e é uma forma deselegante para esse fim.
Eu ainda envio email para o usuário principal do sistema para sair. Outra forma é agendar a atualização do sistema para determinado horário e informar ao usuário que o sistema deverá ser interrompido neste horário.


As atualizações que eu faço são do tipo "on the fly" ou seja faço um backup da versão atual renomeando o executável atual com data e hora e substituo o executável e informo a cada 60 segundos com timer sobre essa atualização informando o motivo da atualização e peço para sair para efetivar.
O próprio sistema é autoatualizado.
Funciona sem problemas.
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Detectar se o sistema estah em uso

Mensagem por Eolo »

Os mais técnicos vão arrepiar, mas eu uso uma solução bem simples, que funciona.

Meu EXE abre um arquivo TXT em modo exclusivo, com FOPEN(ARQUIVO,18). Se alguém mais tentar bloquear o mesmo TXT, não vai conseguir, prova de que o EXE está rodando. Isto, inclusive, elimina a chance do usuário abrir uma segunda instância do EXE.

Se alguém conseguir bloquear (por ex, o atualizador), ele assume o EXE e ninguém mais entra (usuário). É só socar uma mensagem tipo "Sistema em atualização" no TXT.

Nas atualizações do EXE, primeito bloqueio o TXT. Se conseguir, o usuário não entra mais, então consigo atualizar o EXE sem problemas. Funciona 101%. Tem uns detalhes, mas não cabe mencionar, é só cada um adaptar a idéia ao seu sistema.


PS. Tenho um cliente, que atendo via Teamviewer, que abre dezenas de janelas do Outlook 2010, vira uma salada, aí ele me liga pedindo socorro. Se o Outlook criasse um TXT em modo exclusivo, só abriria uma janela... Se bem que é bom que ele me ligue, assim faturo.

PS2. Tem um outro treco bacana, dica do Leonardo Machado, que é criar arquivos HRB. Fantástico. Você atualiza seu sistema sem precisar derrubar o usuário. Tenho um sistema rodando com HRB, nunca deu problemas.
Responder