Impedir que o sistema abra várias vezes

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Josmar dos Santos
Usuário Nível 3
Usuário Nível 3
Mensagens: 277
Registrado em: 11 Jan 2006 18:36
Localização: Botucatu-SP

Impedir que o sistema abra várias vezes

Mensagem por Josmar dos Santos »

Bom dia pessoal...
Gostaria de saber como impedir que o usuário abra o sistema várias vezes no windows atraves do atalho...sem mais obrigado..
Josmar
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4665
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

Amiguinho

Este foi um assunto amplamente discutido no forum com muitos exemplos apresentados, mas na busca do forum não me lembro de uma palavra chave para encontra-la.

Se voce usa o BLINKER pode fazer isto:

Código: Selecionar todos

   enable  = .t.
   disable = .f.
   for i = 1 to 5
       if ! SWPGETPID("sistema.exe") // Se o programa nao estiver rodando
          SWPSETPID("sistema.exe")   // Marca-lo em memoria como ativo 
       endif
   next
   if SWPGETPID("nf.exe")       // Se o programa ja estiver rodando
      clear screen
      ? "Aplicativo ja esta em uso NESTA estacao."
      ? "(Digite EXIT para retornar)"
      ? " "
      QUIT
   else
      SWPSETPID("nf.exe")   // Marca-lo em memoria como ativo
   endif
...
Caso precise de algo mais elaborado:

Código: Selecionar todos

FUNCTION SESSAO2( MO_DO )
   IF !FILE("SESSAO.DBF")
      ESTRU_DBF := {}
      AADD( ESTRU_DBF, { "ESTACAO"  , "C", 8, 0 } )
      AADD( ESTRU_DBF, { "DATA"     , "D", 8, 0 } )
      AADD( ESTRU_DBF, { "HORA"     , "C", 8, 0 } )
      AADD( ESTRU_DBF, { "SITUACAO" , "N", 1, 0 } )
      DBCREATE( "SESSAO", ESTRU_DBF )
   ENDIF
   M->ESTACAO := HDSERIAL()
   USE SESSAO SHARED
   LOCATE FOR ESTACAO = M->ESTACAO
   IF MO_DO = 'ON'
      IF !FOUND()
         APPEND BLANK
         SESSAO->ESTACAO  := M->ESTACAO
         SESSAO->DATA     := DATE()
         SESSAO->HORA     := TIME()
         SESSAO->SITUACAO := 1 // 1 Aberto 0 Fechado
         COMMIT
      ELSE
         IF SESSAO->SITUACAO = 0
            SESSAO->DATA     := DATE()
            SESSAO->HORA     := TIME()
            SESSAO->SITUACAO := 1 // 1 Aberto 0 Fechado
            COMMIT
         ELSE
            CLS
            @ 02,00 SAY "O Sistema ja esta sendo executado..."
            RETURN .F.
         ENDIF
      ENDIF
   ELSE
      IF !FOUND()
         APPEND BLANK
         SESSAO->ESTACAO  := M->ESTACAO
         SESSAO->DATA     := DATE()
         SESSAO->HORA     := TIME()
         SESSAO->SITUACAO := 0 // 1 Aberto 0 Fechado
         COMMIT
      ELSE
         RLOCK()
         SESSAO->DATA     := DATE()
         SESSAO->HORA     := TIME()
         SESSAO->SITUACAO := 0 // 1 Aberto 0 Fechado
         COMMIT
      ENDIF
   ENDIF
   RETURN .T.
Ou use isto:

Código: Selecionar todos

...
if file("ativo.atv") // Se o arquivo existe
   ferase("ativo.atv") // tentara apaga-lo
   if ferror() > 0 // Se nao conseguiu é porque ja esta em uso
      ? 'Sistema em uso. Impossivel abrir'
      quit
   endif
   errHD := fCreate( "ativo.atv" ) // Cria o arquivo
   // Abre o mesmo e deixa-o aberto enquanto o sistema estiver ativo
   fOpen( errHD, 1 ) 
endif
...
Para usar esta ultima opção em rede, troque a palavra ativo.atv pela string que devolve o serial do hd.

@braços :?)
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.
Josmar dos Santos
Usuário Nível 3
Usuário Nível 3
Mensagens: 277
Registrado em: 11 Jan 2006 18:36
Localização: Botucatu-SP

Atalho

Mensagem por Josmar dos Santos »

Ola Rochinha..Sim, de fato eu andei procurando alguma coisa a respeito desse topico, mas te confesso que não encontrei.
Em relação as suas dicas, vou testa-las no meu sistema....
Fico muito grato ..
Um abraço..Josmar
Avatar do usuário
Augusto
Usuário Nível 3
Usuário Nível 3
Mensagens: 473
Registrado em: 26 Ago 2003 17:50
Localização: Maricá/RJ
Contato:

Mensagem por Augusto »

Rochinha...

Muito me interessou o seu 1o. exemplo porém... fiz o teste e nada aconteceu... assim como tbm não entendi o prq das variáveis "enable" e "disable" uma vez que vc não faz referencia a elas em nenhum momento durante o exemplo e o prq tbm do "for/next"...

Poderia explicar ?? Estaria faltando alguma coisa ??

Grato...
:xau Fui...
goulart@provsul.com.br

Faça da PROVSUL o seu Provedor de Serviços WEB
Visite: www.PROVSUL.com.br
Avatar do usuário
Daniel
Usuário Nível 3
Usuário Nível 3
Mensagens: 373
Registrado em: 13 Ago 2003 22:42
Localização: Apucarana - PR

Mensagem por Daniel »

Rochinha

eu testei os primeiro e o ultimo, nenhum funcionou no XP
Voce teria algum que funcionace no xp
Daniel

Harbour + Minigui + dbfcdx
Marinas-Gui Pena que parou o suporte
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4665
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

Amiguinhos

Os codigos postados foram tirados de alguns .PRGs que possuo aqui e portanto não testei, apenas olhei e postei.

Mas aqui esta a verificação e solução para o travamento:

Código: Selecionar todos

...
if !file("ativo.atv")
   // Se o arquivo nao existe, cria-o
   errhandle = fcreate("ativo.atv")
   fwrite(errhandle,"ATV=01")
else
   // Se o arquivo existe tentara apaga-lo
   ferase("ativo.atv")
   if ferror() > 0 // Se nao conseguiu é porque ja esta em uso 
      ? 'Sistema em uso. Impossivel abrir' 
      quit 
   endif 
endif
// Abre o mesmo e deixa-o aberto enquanto o sistema estiver ativo 
errhandle = fopen("ativo.atv",2)
...
// Resto do sistema
Foi testado no Windows 2003 Server em duas janelas DOS abertas em uma unica maquina.

@braços :?)
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.
Grings
Usuário Nível 3
Usuário Nível 3
Mensagens: 340
Registrado em: 18 Ago 2004 13:51

Mensagem por Grings »

Caro Rochinha, testei no Xp e não funcionou, abre diversas janelas.
Avatar do usuário
Daniel
Usuário Nível 3
Usuário Nível 3
Mensagens: 373
Registrado em: 13 Ago 2003 22:42
Localização: Apucarana - PR

Mensagem por Daniel »

Rochinha

este ultimo tambem nao funcionou no XP
Daniel

Harbour + Minigui + dbfcdx
Marinas-Gui Pena que parou o suporte
Avatar do usuário
Augusto
Usuário Nível 3
Usuário Nível 3
Mensagens: 473
Registrado em: 26 Ago 2003 17:50
Localização: Maricá/RJ
Contato:

Mensagem por Augusto »

Bem... depois de tantos exemplos (e realmente nenhum deles funcionou no XP) com base em um deles, eu fiz um, simplezinho, que funciona... o único problema é que se o sistema for "abortado" babau...

Mas é claro que, com boa vontade e usando de outros métodos esse problema pode ser solucionado...

Código: Selecionar todos

IF !FILE("c:\SESSAO.DBF") 
	ESTRU_DBF := {} 
	AADD( ESTRU_DBF, { "log"  , "C", 1, 0 } ) 
	DBCREATE( "c:\SESSAO", ESTRU_DBF )
ELSE
	alert('Já existe uma janela do sistema aberta - Verifique')
	clear
	quit
ENDIF
Notem que o arquivo "SESSAO.DBF" é criado/excluido no HD da estação...
:xau Fui...
goulart@provsul.com.br

Faça da PROVSUL o seu Provedor de Serviços WEB
Visite: www.PROVSUL.com.br
Grings
Usuário Nível 3
Usuário Nível 3
Mensagens: 340
Registrado em: 18 Ago 2004 13:51

Mensagem por Grings »

A rotina abaixo funciona bem, porém não pode haver nenhum Close Databases ou DbCloseAll() durante a execução do programa.

Código: Selecionar todos

If !File('STATUS.DBF')
   aStructure:={}
   AADD(aStructure,{'STATUS', 'L', 01, 0})
   DbCreate('Status.DBF',aStructure)
EndIf

DbUseArea(.T.,NIL,'STATUS.DBF',NIL,.F.,.F.)
If NetErr()
   Alert('O programa ja  esta aberto em outra janela! Pressione qualquer tecla e, apos, maximize-o, com o mouse, na barra de tarefas...', )
   Quit
Else
   Use Status New
EndIf
Editado pela última vez por Pablo César em 23 Mar 2013 04:53, em um total de 1 vez.
Razão: Mensagem editada para colocar a tag [ code ]<br>Veja como utilizar esta tag: http://www.pctoledo.com.br/forum/faq.php?mode=bbcode#f2r1
Josmar dos Santos
Usuário Nível 3
Usuário Nível 3
Mensagens: 277
Registrado em: 11 Jan 2006 18:36
Localização: Botucatu-SP

abrir varias

Mensagem por Josmar dos Santos »

Caros colegas, se vocês que ja sâo veteranos, estão batendo cabeça, imagine eu que sou iniciante.
mas confesso a vocês que estou anotando todos esses exemplos que vocês estão colocando no tópico..
Josmar
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem por Eolo »

Josmar,

Eu uso o Clipper 52 e o Blinker 51, e em todos os meus programas tem um tréco que mata esse problema e que funciona em qualquer Windows (98 / ME / XP e 2000): no começo do programa principal, eu abro o próprio EXE, em modo "exclusivo".

Por exemplo, se o seu programa principal se chama APP.EXE e está na pasta CLIENTEX, bota o seguinte no começo dele:
arq1=fopen("c:\clientex\app.exe",2)
if arq1=-1
quit
endi

Roda o EXE e, se você tentar abrir o mesmo EXE em outra janela, vai dar "acesso negado".

No final do seu programa, inclua:
arq1=fclose(arq1)

Faltou luz? Teve que dar um RESET? Sem problemas. Quando reiniciar, a primeira janela do seu EXE vai abrir normalmente...

Eolo
Avatar do usuário
Clipper
Colaborador
Colaborador
Mensagens: 1334
Registrado em: 23 Ago 2004 00:04
Localização: Recife/PE

Mensagem por Clipper »

Isso já foi discutido 3780209673673 de vezes aqui, segue abaixo uma função que funciona em qualquer versão, pode abortar o sistema que não dá pau.

www.sistemabr.cjb.net/tvjanxp.zip

Até logo.

Marcelo
Programador que é programador, quando tá de folga vai inventar função nova, fazer testes, ou seja... se divertir
Cobra 210 - Drive de 8" 1.024 KB - 64 KB RAM - Impressora de Linha Cobra - Visicalc - Fortran - Dialog - Sistema Operacional SP/M (é sp/m mesmo - era o cp/m da cobra)
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem por Eolo »

Marcelo,

Vc sugeriu a mesma coisa, só que usando outro arquivo (CONTROLE.ini). Então, porque criar esse novo arquivo se dá pra usar o próprio EXE?

Além de um arquivo extra, vc gastou 20 e poucas linhas e uma função pra fazer o que eu fiz em 3 linhas... Não entendi o que acrescentou.

Eolo
Avatar do usuário
Clipper
Colaborador
Colaborador
Mensagens: 1334
Registrado em: 23 Ago 2004 00:04
Localização: Recife/PE

Mensagem por Clipper »

Simplesmente pq seu exemplo vai dar pau se o EXE for executado em rede e mais de uma estação precisar chamá-lo.

Simples.

E não venha dizer que basta chamar o EXE do próprio HD, imaginemos que a estação não tenha HD.

Até logo.

Marcelo
Programador que é programador, quando tá de folga vai inventar função nova, fazer testes, ou seja... se divertir
Cobra 210 - Drive de 8" 1.024 KB - 64 KB RAM - Impressora de Linha Cobra - Visicalc - Fortran - Dialog - Sistema Operacional SP/M (é sp/m mesmo - era o cp/m da cobra)
Responder