Travar 2 execucoes do sistema clipper no xp

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

managercorp
Usuário Nível 3
Usuário Nível 3
Mensagens: 138
Registrado em: 16 Nov 2004 11:03
Localização: recife
Contato:

Travar 2 execucoes do sistema clipper no xp

Mensagem por managercorp »

To falando daquela funcao que bloqueia que se
abra mais de uma vez o mesmo programa.

No windows 98 o travajan() funciona beleza
no xp nao da certo
alguem tem alguma solucao ?
Alexandre Pessoa
alexandre@managercorp.com.br
81-96152319
Avatar do usuário
rrfsistemas
Usuário Nível 3
Usuário Nível 3
Mensagens: 249
Registrado em: 11 Jul 2004 18:16
Localização: Uberlândia/MG

Mensagem por rrfsistemas »

Caro Alexandre :



Eu faço um arquivo como flag de abertura do sistema na máquina cliente, ou seja, quando o sistema é executado crio um arquivo chamado siadem.sys com uma string "ON" sinalizando que o arquivo está em execução.

Quando saio do sistema este arq é apagado.

Existe uma rotina que verifica se o arquivo existe e se a string este On caso contrario o sistema será executado normalmente.
"Não é a ferramenta que faz o artesão e sim a sua criatividade...""
Renato Ribeiro Ferreira
Tecnologia em Analise de Sistemas de Informação
http://www.rrfsistemas.hd1.com.br
( VFP 9 + MySql e/ou Oracle 11 ) - ...Harbour/MiniGui...
Everton
Usuário Nível 3
Usuário Nível 3
Mensagens: 143
Registrado em: 07 Jul 2004 08:53
Localização: Campo Grande - MS

Mensagem por Everton »

Olá Alexandre, desculpe não tem nada a ver com o tópico, mas vc poderia me indicar onde posso conseguir esta função TRAVAJAN(), pois estou com problemas desse tipo em alguns.

mich.cpd@terra.com.br

Grato pela Atenção
Everton Luiz Penteado
Clipper 5.2b - Blink 7.0
kenew
Usuário Nível 2
Usuário Nível 2
Mensagens: 97
Registrado em: 08 Set 2004 15:08
Contato:

Mensagem por kenew »

Uma pergunta que tem a ver com o assunto, o clipper ele cria um arquivo temporario para casa execução do executavel, tipo "AB9R7DFJ" bom não tempo como o executavel saber q arquivo o programa esta criando, assim poderiamos checar se existir não deixar abrir o executavel novamente.

E no caso deste TRAVAJAN() como ele faz quando o sistema termina inesperadamente ou quando a mumia do usuario miniza a janela e fecha o sistema pelo modo não convencional.
Avatar do usuário
Clipper
Colaborador
Colaborador
Mensagens: 1334
Registrado em: 23 Ago 2004 00:04
Localização: Recife/PE

Mensagem por Clipper »

Prezados Colegas

A TRAVAJAN funciona perfeitamente mesmo que o sistema "caia" ou que o usuário feche o programa de outra maneira que não seja a correta, quanto ao problema dela no XP realmente vamos ter que fazer de outra forma.

Até logo.

Marcelo
kenew
Usuário Nível 2
Usuário Nível 2
Mensagens: 97
Registrado em: 08 Set 2004 15:08
Contato:

Mensagem por kenew »

Opa então to nessa ... se alguem puder me enviar esta função eu quero.

Obrigado
managercorp
Usuário Nível 3
Usuário Nível 3
Mensagens: 138
Registrado em: 16 Nov 2004 11:03
Localização: recife
Contato:

AI VAI GALERA

Mensagem por managercorp »

FUNCAO PARA NAO ABRIR MAIS DE UMA COPIA NO MESMO MICRO
ATENCAO SO FUNCIONA O WIN98 NO XP NAO FUNCIONA
SE ALGUEM DESCOBRIR ME PASSEM POR EMAIL
solucoeshotel@bol.com.br
quando pedi a solucao para Xp
o usuario rrfsistemas falou para criar um arquivo .sys, mas ante mao eu aviso que nao funciona pois se resetar a maquina ou mesmo sair com alt+c o sys nao sera apagado e a solucao nao funcionara.
esta que coloco aqui para o 98 funciona de qualquer forma, mesmo que
o usuario desligie, reset.
*****************************************
* coloque estas linhas no inicio do sistema

XVERWIN='N'
IF FILE("C:\WINDOWS\WIN.INI")
XVERWIN='S'
ENDIF
IF XVERWIN='S'
travajanJ()
if travajanJ()=.F.
CLEAR
ALERT("ATENCAO: O Sistema ja Esta em Uso Nesta Estacao, Execute a Barra do Sistema Minimizado no seu Windows")
clear
QUIT
ENDIF
ENDIF

*************
FUNCTION TRAVAJANJ
IF !FILE("C:\WINDOWS\CONTROLE.INI")
VA=FCREATE("C:\WINDOWS\CONTROLE.INI",0)
FWRITE(VA,"[ Arquivo de Controle do Sistema ]")
FCLOSE(VA)
ELSE
VA=FOPEN("C:\WINDOWS\CONTROLE.INI",1)
IF FERROR()<>0
CLS
@ 02,00 SAY "O Sistema ja esta sendo executado..."
@ 03,00 SAY STRZERO(FERROR(),3)
@ 04,00 SAY STRZERO(VA,3)
@ 05,00 SAY REPLICATE("=",40)
RETURN(.F.)
ENDIF
ENDIF
RETURN(.T.)
Alexandre Pessoa
alexandre@managercorp.com.br
81-96152319
Avatar do usuário
Clipper
Colaborador
Colaborador
Mensagens: 1334
Registrado em: 23 Ago 2004 00:04
Localização: Recife/PE

Mensagem por Clipper »

Prezados Colegas

A função TRAVAJAN foi desenvolvida por mim a bastante tempo, só que na versão original eu deixo o sistema criar o arquivo CONTROLE.INI no diretório corrente porque existe um problema em criar em uma pasta especifica. Exemplo : Se o windows do usuário não estiver no diretório que foi especificado irá dar problema.

Segue abaixo o código original

Código: Selecionar todos

*---------------------------------------------------------------*
* Esta fun?Æo impede que um sistema seja aberto mais de uma vez *
* fa?a a cahamada dela no inicio do sistema                     *
* Exemplo                                                       *
* IF TRAVAJAN()=.F.                                             *
*    //Sai do sistema
*    QUIT // Ou RETURN  
* ENDIF
*                                                               *
*---------------------------------------------------------------*
*-----------------*
 FUNCTION TRAVAJAN
*-----------------*
IF !FILE("CONTROLE.INI")
   VA=FCREATE("CONTROLE.INI",1)
   FWRITE(VA,"[ Arquivo de Controle do Sistema ]")
ELSE
   VA=FOPEN("CONTROLE.INI",1)
   IF FERROR()<>0
      CLS
      @ 02,00 SAY "O Sistema ja esta sendo executado..."
      @ 03,00 SAY STRZERO(FERROR(),3)
      @ 04,00 SAY STRZERO(VA,3)
      @ 05,00 SAY REPLICATE("=",40)
      RETURN(.F.)
   ENDIF
ENDIF
RETURN(.T.)

*** Antes de finalizar o sistema é recomendável usar
***FCLOSE(VA)
***
Apesar deste código funcionar perfeitamente, eu preferi fazer e usar uma outra versão que funciona em rede gravando o arquivo no diretório padrão do servidor, para tanto na criação do arquivo eu insiro o número da estação na extensão do nome do arquivo. Exemplo :

CONTROLE.001 = Estação 1
CONTROLE.002 = Estação 2

Neste caso cada estação terá uma variável de ambiente especificando o número da estação. No meu caso eu uso uma chamada WKSNET.

Quanto a ele não funcionar no XP ainda estou tentando resolver isso, eita versão mais fd... de Rwindows...:x:x:x:x:x:x:x:x:x:x

Até logo.

Marcelo
kenew
Usuário Nível 2
Usuário Nível 2
Mensagens: 97
Registrado em: 08 Set 2004 15:08
Contato:

Mensagem por kenew »

Ainda insito na idéia de utilizar o nome do arquivo temporario q o executavel cria automaticamente, será q não tem como obter o nome deste arquivo para saber se o exe já esta aberto, assim não teria problemas com WIN98, XP ou qualquer outro.
Avatar do usuário
Clipper
Colaborador
Colaborador
Mensagens: 1334
Registrado em: 23 Ago 2004 00:04
Localização: Recife/PE

Mensagem por Clipper »

Prezado Kenew

Vejo 2 problemas.

1 - Acho muito dificil que consigamos pegar o nome do arquivo temporário, principalmente porque é aleatório.

2 - Se ele é criado na entrada do executável de forma aleatória vai ser criado provavelmente com outro nome tornando impossível fazer o proposto.

Já fiz vários testes com várias funções de tratamento de arquivos porém não obtive exito com nenhuma, acabou de me ocorrer uma idéia...vou testar... volto já...

Até logo.

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

Mensagem por Clipper »

Resolvido o problema...

Código: Selecionar todos

CLS
NOME=SPACE(50)

TRAVA=TRAVAJANXP()
IF TRAVA=.F.
   RETURN
ENDIF

@ 05,00 SAY "NOME -> " GET NOME PICT "@!"
READ
RETURN

*-------------------*  
 FUNCTION TRAVAJANXP  
*-------------------* 
IF .NOT. FILE("CONTROLE.INI")
   aStructure := {} 
   aAdd( aStructure,{"CONTROL","C",1,0})
   dbCreate( "CONTROLE.INI",aStructure)
   USE CONTROLE.INI EXCLUSIVE
ELSE
   USE CONTROLE.INI EXCLUSIVE
   IF NETERR()
      CLS
      @ 02,00 SAY "O Sistema ja esta sendo executado nesta estacao"
      @ 03,00 SAY STRZERO(FERROR(),3)
      @ 04,00 SAY REPLICATE("=",50)
      INKEY(0)
      RETURN(.F.)
   ENDIF
ENDIF
// LEMBRAR DE NO FINAL DO SITEMA FECHAR O ARQUIVO 
// OBVIAMENTE QU SE VOCE USAR UM DBCLOSEALL() NAO PRECISA SE PREOCUPAR
RETURN(.T.)
Até logo.

Marcelo
Responder