Página 1 de 2

Detectar se o sistema estah em uso

Enviado: 23 Abr 2013 10:48
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.

Detectar se o sistema estah em uso

Enviado: 23 Abr 2013 10:53
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.

Detectar se o sistema estah em uso

Enviado: 23 Abr 2013 11:03
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.

Detectar se o sistema estah em uso

Enviado: 23 Abr 2013 11:27
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

Detectar se o sistema estah em uso

Enviado: 23 Abr 2013 11:53
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.

Detectar se o sistema estah em uso

Enviado: 23 Abr 2013 21:45
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.

Detectar se o sistema estah em uso

Enviado: 23 Abr 2013 23:23
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

Detectar se o sistema estah em uso

Enviado: 24 Abr 2013 14:38
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


Detectar se o sistema estah em uso

Enviado: 24 Abr 2013 15:05
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.

Detectar se o sistema estah em uso

Enviado: 24 Abr 2013 15:28
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á.

Detectar se o sistema estah em uso

Enviado: 24 Abr 2013 16:40
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. :)

Detectar se o sistema estah em uso

Enviado: 24 Abr 2013 18:02
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.

Detectar se o sistema estah em uso

Enviado: 24 Abr 2013 22:07
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.

Detectar se o sistema estah em uso

Enviado: 01 Mai 2013 17:30
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.

Detectar se o sistema estah em uso

Enviado: 02 Mai 2013 00:13
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.