Página 1 de 2
Informar ao Servidor Windows que a Tarefa terminou
Enviado: 03 Fev 2016 14:12
por lugab
Amigos, salve, salve....
Quado se sai do programa em uso, demora para o Windows notificar o servidor que a tarefa terminou, principalmente quando a tarefa termina abruptanente, por algum tipo de erro...
Algum de vcs sabe se existe algum comando do windows que encerre a tarefa já teminada e que possa ser colocada no Arquivo .BAT , logo após a linha para executar o programa ??
ex...
Código: Selecionar todos
f:
cd\dados
programa.exe
kill "programa.exe" <-- Aqui é um mero chute, local onde colocar o comando pra avisar o Windows que a tarefa da linha acima treminou, ok ?
PS: o "TSKILL" do Windows é inviável, pq só funciona se o BAT tivesse como saber, previamente, o número do processo que o Programa.exe do exemplo
ganhou na lista de Processos em curso no Windows, que se trata de uma numeração dinâmica e que se obtém se exeutar o TASKLIST
Grato,
Informar ao Servidor Windows que a Tarefa terminou
Enviado: 05 Fev 2016 20:44
por asimoes
Procure no fórum por WIN_KILLPROCESS
Informar ao Servidor Windows que a Tarefa terminou
Enviado: 05 Fev 2016 21:50
por lugab
Ótima dica, Asimoes, valeu...
A nível local funcionou Perfeito, MUITO OBRIGADO.....
Resta saber quando essa função for disparada pela estação que estiver acessando Executável e dados em um Servidor comum ( pasta mapeada, tipo F:\) e também
quando ela for disparado por estação que esta´acessando Prg+Dados do servidor, via TS ..
Otimo canaval pra vc
Informar ao Servidor Windows que a Tarefa terminou
Enviado: 05 Fev 2016 22:09
por asimoes
Lugab,
Você pode criar um programa (killprograma.exe) com a função WIN_KILLPROCESS e colocar na bat conforme você postou.
:
cd\dados
programa.exe
killprograma.exe (mata o programa.exe do processo do windows)
Informar ao Servidor Windows que a Tarefa terminou
Enviado: 06 Fev 2016 00:40
por lugab
Sim, foi isso o que fiz, Asimoes...
A nível local funcionou perfeito: Programa.exe + dados + computador local, tudo no disco C...
A questão é: Acessando via TS, onde várias pessoas estão usando o mesmo PROGRAMA.EXE+Dados no Servidor. Eu acredito que essa função vai killar é todo mundo, em vez de apenas o usuário desejado,
Informar ao Servidor Windows que a Tarefa terminou
Enviado: 06 Fev 2016 09:26
por asimoes
Lugab,
Tem como resolver isso, veja se concorda comigo, toda vez que o usuário executar o programa.exe, um id de processo é criado, o programa.exe poderia gravar este id em um arquivo de controle de acesso em caso de gpf do programa.exe o kill seria para o id do gpf
Informar ao Servidor Windows que a Tarefa terminou
Enviado: 06 Fev 2016 10:14
por asimoes
Lugab o acesso remoto é feito com único usuário ? ou previamente cadastrados?
Informar ao Servidor Windows que a Tarefa terminou
Enviado: 06 Fev 2016 10:16
por ANDRIL
lugab escreveu:A questão é: Acessando via TS, onde várias pessoas estão usando o mesmo PROGRAMA.EXE+Dados no Servidor. Eu acredito que essa função vai killar é todo mundo, em vez de apenas o usuário desejado,
Teoricamente não, uma vez que cada sessão TS é independente da outra, ou seja, cada usuário abre sua própria instância. Faça o teste real para tirar essa dúvida. Cada usuário tem seu desktop e configurações personalizadas o mesmo deve ocorrer com um programa aberto por ele.
Até+
Informar ao Servidor Windows que a Tarefa terminou
Enviado: 06 Fev 2016 10:22
por asimoes
Andril,
Se é assim que funciona então em caso de crash da aplicação e se ficar algum id de processo, pode fazer o kill, sem afetar os outros acessos, desde que seja o próprio id.
Informar ao Servidor Windows que a Tarefa terminou
Enviado: 06 Fev 2016 10:26
por asimoes
Um exemplo:
função no programa.exe que grava em um dbf que será usado pelo kill externo ou do prórpio programa.exe
Código: Selecionar todos
FUNCTION SistemaExecutando
LOCAL aProcs := {}, cExeName
cExeName := SubStr(hb_ArgV(0), RAT(hb_PS(), hb_ArgV(0)) + 1 )
WIN_GetProcessList( aProcs, cExeName )
DbUseArea(.T., "DBFCDX", "ACESSO", "ACESSO", .T.)
ACESSO->(DbAppend())
ACESSO->Data:=Date()
ACESSO->Hora:=Time()
ACESSO->ID :=aProcs[Len( aProcs ),2]
ACESSO->(DbCommit(), DbUnLock())
RETURN .T.
Informar ao Servidor Windows que a Tarefa terminou
Enviado: 06 Fev 2016 10:42
por asimoes
Se o acesso remoto tem sua própria instância usuário distinto então a função pode ser assim:
Código: Selecionar todos
FUNCTION SistemaExecutando
LOCAL aProcs := {}, cExeName
cExeName := SubStr(hb_ArgV(0), RAT(hb_PS(), hb_ArgV(0)) + 1 )
WIN_GetProcessList( aProcs, cExeName )
DbUseArea(.T., "DBFCDX", "ACESSO", "ACESSO", .T.)
ACESSO->(DbAppend())
ACESSO->Data:=Date()
ACESSO->Hora:=Time()
ACESSO->ID :=aProcs[Len( aProcs ), 2] //id
ACESSO->User:=aProcs[Len( aProcs ), 4] //user
ACESSO->(DbCommit(), DbUnLock())
RETURN .T.
Informar ao Servidor Windows que a Tarefa terminou
Enviado: 06 Fev 2016 10:46
por ANDRIL
Disse "teoricamente", para tirar a dúvida basta ir ao servidor com as estações usando o sistema e abrir o gerenciador de tarefas, talvez consiga ver quantos do seu programa estão abertos. Usuários eu sei que tem como saber os logados. Tente ai.
Informar ao Servidor Windows que a Tarefa terminou
Enviado: 06 Fev 2016 10:48
por asimoes
Andril, só o lugab pode responder, estou somente passando a dica, :)Pos
Informar ao Servidor Windows que a Tarefa terminou
Enviado: 06 Fev 2016 18:10
por lugab
Boa tarde, pessoal
Sim, vou testar as sugestões todas e postar as conclusões aqui....
Fico lisonjeado com tanta ajuda e agradeço a assistência do Asimoes e do Andril
Bom carnaval para todos....
Informar ao Servidor Windows que a Tarefa terminou
Enviado: 06 Fev 2016 19:54
por JoséQuintas
Sinceramente não entendo essas coisas.
Aqui uso terminal remoto, hbnetio, mysql, e até multithread, tudo junto e misturado.
Será que não exagerou nas rotinas de erro e por isso o problema?
Nota:
SEMPRE uma rotina MAIN fica rodando sem tela aguardando as demais, no caso das LIBs gráficas.
Alguém esqueceu disso, ou você ou a sua lib gráfica.
Avise qual é, pra eu não usar....rs